3DTEST.C 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
  11. COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
  12. */
  13. #define DOUBLE_BUFFER 1
  14. #define USE_MOUSE 0
  15. #include <conio.h>
  16. #include "mono.h"
  17. #include "mouse.h"
  18. #include "gr.h"
  19. #include "3d.h"
  20. //#include "segment.h"
  21. #include "out.c"
  22. grs_canvas *off_screen_buffer;
  23. #define N_SEG_VERTS (sizeof(Vertices) / sizeof(*Vertices))
  24. g3s_point segment_points[N_SEG_VERTS];
  25. void do_int3();
  26. #pragma aux do_int3 = "int 3";
  27. #define f1_1 (65536*11/10)
  28. grs_canvas *screen_canv; //the one on the screen
  29. #define VIEWER_DIST i2f(100)
  30. void segment_test()
  31. {
  32. int exit_flag=0;
  33. vms_vector viewer_position={0,0,-VIEWER_DIST};
  34. vms_angvec viewer_orient={0,0,0};
  35. vms_matrix viewer_matrix={ f1_0,0,0,
  36. 0,f1_0,0,
  37. 0,0,f1_0};
  38. fix viewer_dist = VIEWER_DIST;
  39. int k;
  40. fix viewer_zoom=f1_0;
  41. g3_set_points(segment_points,Vertices);
  42. while (!exit_flag) {
  43. #if USE_MOUSE
  44. short dx,dy;
  45. short btns;
  46. mouse_get_delta(&dx,&dy);
  47. btns = mouse_get_btns();
  48. if (btns) {
  49. viewer_dist += i2f(dy);
  50. }
  51. else if (! (dx==0 && dy==0)) {
  52. vms_matrix rotmat,tempm;
  53. GetMouseRotation(dx,dy,&rotmat);
  54. vm_matrix_x_matrix(&tempm,&viewer_matrix,&rotmat);
  55. viewer_matrix = tempm;
  56. }
  57. #else
  58. //vm_angvec_make(&viewer_orient,0x1707,0x49b,0x2e0e);
  59. //vm_angvec_make(&viewer_orient,0x6e05,0x1601,0xdc0a);
  60. mprintf(0,"orient = %04x %04x %04x\n",viewer_orient.p,viewer_orient.b,viewer_orient.h);
  61. // k=getch(); exit_flag=(k==27); if (k==8) do_int3();
  62. vm_angles_2_matrix(&viewer_matrix,&viewer_orient);
  63. #endif
  64. viewer_position.x = -viewer_matrix.m3;
  65. viewer_position.y = -viewer_matrix.m6;
  66. viewer_position.z = -viewer_matrix.m9;
  67. vm_vec_scale(&viewer_position,viewer_dist);
  68. #if DOUBLE_BUFFER
  69. gr_set_current_canvas(off_screen_buffer);
  70. #endif
  71. gr_clear_canvas(0);
  72. g3_start_frame();
  73. // g3_set_view_angles(&viewer_position,&viewer_orient,viewer_zoom);
  74. g3_set_view_matrix(&viewer_position,&viewer_matrix,viewer_zoom);
  75. draw_segment(&Seg1);
  76. g3_end_frame();
  77. #if !USE_MOUSE
  78. viewer_orient.p += 65535/1500;
  79. viewer_orient.h += 65536/500;
  80. viewer_orient.b += 65536/1000;
  81. #endif
  82. #if DOUBLE_BUFFER
  83. gr_set_current_canvas(screen_canv);
  84. gr_ubitmap(0,0,&off_screen_buffer->cv_bitmap);
  85. #endif
  86. if (kbhit()) {
  87. k=getch();
  88. exit_flag=(k==27);
  89. if (k==' ') do_int3();
  90. if (k=='[') viewer_zoom=fixmul(viewer_zoom,f1_1);
  91. if (k==']') viewer_zoom=fixdiv(viewer_zoom,f1_1);
  92. }
  93. }
  94. }
  95. //#include "draw_seg.c"
  96. // ----------------------------------------------------------------------------
  97. void draw_segment(segment *s)
  98. {
  99. int f;
  100. // int v;
  101. short *vp;
  102. int nv,nf;
  103. face *face;
  104. seg_get_vertex_list(s,&nv,&vp); // set nv = number of vertices, vp = pointer to vertex indices
  105. seg_get_num_faces(s,&nf); // set nf = number of faces
  106. g3_rotate_list(nv,vp);
  107. for (f=0; f<nf; f++) {
  108. face = &Faces[f];
  109. seg_get_face_vertex_list(s,f,&nv,&vp); // set nv = number of vertices in face, vp = pointer to vertex indices
  110. gr_setcolor(f+1);
  111. // for (v=0;v<nv-1;v++)
  112. // g3_draw_line(vp[v],vp[v+1]);
  113. // g3_draw_line(vp[v],vp[0]);
  114. //g3_draw_poly(4,vp,0);
  115. //g3_check_and_draw_poly(4,vp,0,NULL);
  116. //if (g3_check_normal_facing(&Vertices[vp[0]],&face->normal))
  117. // g3_draw_poly(4,vp,0);
  118. g3_check_and_draw_poly(4,vp,&face->normal);
  119. }
  120. }
  121. main()
  122. {
  123. minit();
  124. gr_init(SM_320x200C); //init 2d, set up 320x200 screen
  125. gr_pal_fade_in(&grd_curscreen->pal);
  126. mouse_init();
  127. screen_canv = grd_curcanv;
  128. // screen_canv = gr_create_sub_canvas(grd_curcanv,0,75,320,50); //short
  129. // screen_canv = gr_create_sub_canvas(grd_curcanv,145,0,50,200); //skinny
  130. #if DOUBLE_BUFFER
  131. off_screen_buffer = gr_create_canvas(screen_canv->cv_bitmap.bm_w,screen_canv->cv_bitmap.bm_h);
  132. #endif
  133. gr_set_current_canvas(&grd_curscreen->sc_canvas);
  134. gr_clear_canvas(1);
  135. gr_set_current_canvas(screen_canv);
  136. g3_init(); //init 3d
  137. segment_test();
  138. g3_close(); //close the 3d
  139. gr_close(); //goodbye to the 2d
  140. }