Advertisement
robn

wavefront.pl

Aug 20th, 2012
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 3.58 KB | None | 0 0
  1. #!/usr/bin/env perl
  2.  
  3. use 5.016;
  4. use warnings;
  5. use strict;
  6. use autodie;
  7.  
  8. use SDL;
  9. use SDL::Video;
  10. use SDL::Event;
  11. use SDL::Events;
  12. use OpenGL;
  13. use Math::Trig;
  14.  
  15. use Data::Printer;
  16.  
  17. usage() if @ARGV != 1;
  18.  
  19. my ($filename) = @ARGV;
  20.  
  21. my $data = load_obj_file($filename);
  22.  
  23. my $WIDTH = 1440;
  24. my $HEIGHT = 900;
  25. my $FOV = 80;
  26.  
  27. SDL::init(SDL_INIT_VIDEO);
  28.  
  29. SDL::Video::set_video_mode($WIDTH, $HEIGHT, 32, SDL_OPENGL);
  30.  
  31. glShadeModel(GL_SMOOTH);
  32. glCullFace(GL_BACK);
  33. glFrontFace(GL_CCW);
  34. #glEnable(GL_CULL_FACE);
  35. glEnable(GL_DEPTH_TEST);
  36. glDepthFunc(GL_LESS);
  37. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  38. glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
  39. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  40.  
  41. {
  42.     my $fov = tan(deg2rad($FOV/2));
  43.     my $near = 1;
  44.     my $far = 100;
  45.     my $left = $fov * $near;
  46.     my $top = $left * $HEIGHT/$WIDTH;
  47.  
  48.     glMatrixMode(GL_PROJECTION);
  49.     glLoadIdentity();
  50.     glFrustum(-$left, $left, -$top, $top, $near, $far);
  51.  
  52.     glMatrixMode(GL_MODELVIEW);
  53.     glLoadIdentity();
  54. }
  55.  
  56. my $zoom = -50;
  57. my $rot_x = 0;
  58. my $rot_y = 0;
  59.  
  60. my $e = SDL::Event->new;
  61. my $done = 0;
  62. my $keydown = 0;
  63.  
  64. while (!$done) {
  65.  
  66.     SDL::Events::pump_events;
  67.     while (SDL::Events::poll_event($e)) {
  68.         given ($e->type) {
  69.             when (SDL_KEYDOWN) {
  70.                 $keydown = $e->key_sym;
  71.             }
  72.             when (SDL_KEYUP) {
  73.                 $keydown = 0;
  74.             }
  75.         }
  76.     }
  77.  
  78.     if ($keydown) {
  79.         given ($keydown) {
  80.             when (SDLK_ESCAPE) {
  81.                 $done = 1;
  82.             }
  83.             when (SDLK_EQUALS) {
  84.                 $zoom += 0.5;
  85.             }
  86.             when (SDLK_MINUS) {
  87.                 $zoom += -0.5;
  88.             }
  89.             when (SDLK_UP) {
  90.                 $rot_x += -1;
  91.             }
  92.             when (SDLK_DOWN) {
  93.                 $rot_x += 1;
  94.             }
  95.             when (SDLK_LEFT) {
  96.                 $rot_y += -1;
  97.             }
  98.             when (SDLK_RIGHT) {
  99.                 $rot_y += 1;
  100.             }
  101.         }
  102.     }
  103.  
  104.     glMatrixMode(GL_MODELVIEW);
  105.     glLoadIdentity();
  106.     glTranslatef(0, 0, $zoom);
  107.     glRotatef($rot_x, 1, 0, 0);
  108.     glRotatef($rot_y, 0, 1, 0);
  109.  
  110.     glClearColor(0.0, 0.0, 0.0, 1.0);
  111.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  112.  
  113.     glBegin(GL_TRIANGLES);
  114.  
  115.     glColor3f(1,1,1);
  116.  
  117.     for my $tri (@{$data->{tris}}) {
  118.         glVertex3f(@{$data->{vertices}->[$tri->[0]->[0]]});
  119.         glVertex3f(@{$data->{vertices}->[$tri->[1]->[0]]});
  120.         glVertex3f(@{$data->{vertices}->[$tri->[2]->[0]]});
  121.     }
  122.  
  123.     glEnd();
  124.  
  125.     SDL::Video::GL_swap_buffers
  126. }
  127.  
  128.  
  129.  
  130. sub load_obj_file {
  131.     my ($filename) = @_;
  132.  
  133.     my %data = (
  134.         vertices => [],
  135.         texcoords => [],
  136.         normals => [],
  137.         tris => [],
  138.     );
  139.  
  140.     open my $fh, "<", $filename;
  141.  
  142.     while (my $line = <$fh>) {
  143.         next if substr($line, 0, 1) eq '#';
  144.  
  145.         my ($cmd, @args) = split /\s+/, $line;
  146.  
  147.         given ($cmd) {
  148.             when ("v") {
  149.                 push $data{vertices}, \@args;
  150.             }
  151.             when ("vt") {
  152.                 push $data{texcoords}, \@args;
  153.             }
  154.             when ("vn") {
  155.                 push $data{normals}, \@args;
  156.             }
  157.             when ("f") {
  158.                 push $data{tris}, [ map { [ map { $_-1 } split '/' ] } @args ];
  159.             }
  160.             default {
  161.                 say "W: unknown command '$cmd' at $filename:$.";
  162.             }
  163.         }
  164.     }
  165.  
  166.     close $fh;
  167.  
  168.     return \%data;
  169. }
  170.  
  171. sub usage {
  172.     say "usage: wavefront <model.obj>";
  173.     exit 1;
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement