[comp.sources.misc] v20i021: sipp2.0 - a library for 3D graphics, Patch02

ingwa@isy.liu.se (Inge Wallin) (05/29/91)

Submitted-by: Inge Wallin <ingwa@isy.liu.se>
Posting-number: Volume 20, Issue 21
Archive-name: sipp2.0/patch02
Patch-To: sipp2.0: Volume 16, Issue 5-10

The following context diff brings SIPP, the Simple polygon processor
to version 2.0.2.  The diff fixes a bug which sometimes caused
polygons to erroneously be marked as facing from the viewer although
they in reality were not.

The patch can also be fetched by anonymous ftp from isy.liu.se
(130.236.1.3) in the subdirectory pub/sipp.

	/Inge and Jonas

                         O /         \ O
------------------------- X snip snip X ------------------------------
                         O \         / O

Common subdirectories: sipp-2.0.1/demo and sipp-2.0.2/demo
Common subdirectories: sipp-2.0.1/doc and sipp-2.0.2/doc
Common subdirectories: sipp-2.0.1/libsipp and sipp-2.0.2/libsipp
diff -c -r sipp-2.0.1/libsipp/geometric.c sipp-2.0.2/libsipp/geometric.c
*** sipp-2.0.1/libsipp/geometric.c	Mon May 27 22:52:57 1991
--- sipp-2.0.2/libsipp/geometric.c	Mon May 27 22:40:51 1991
***************
*** 103,108 ****
--- 103,114 ----
      
      cosang = cos(ang);
      sinang = sin(ang);
+     if (fabs(cosang) < 1.0e-15) {
+         cosang = 0.0;
+     }
+     if (fabs(sinang) < 1.0e-15) {
+         sinang = 0.0;
+     }
      for (i = 0; i < 4; ++i) {
  	tmp = mat->mat[i][1];
  	mat->mat[i][1] = mat->mat[i][1] * cosang
***************
*** 136,141 ****
--- 142,153 ----
      
      cosang = cos(ang);
      sinang = sin(ang);
+     if (fabs(cosang) < 1.0e-15) {
+         cosang = 0.0;
+     }
+     if (fabs(sinang) < 1.0e-15) {
+         sinang = 0.0;
+     }
      for (i = 0; i < 4; ++i) {
  	tmp = mat->mat[i][0];
  	mat->mat[i][0] = mat->mat[i][0] * cosang
***************
*** 169,174 ****
--- 181,192 ----
      
      cosang = cos(ang);
      sinang = sin(ang);
+     if (fabs(cosang) < 1.0e-15) {
+         cosang = 0.0;
+     }
+     if (fabs(sinang) < 1.0e-15) {
+         sinang = 0.0;
+     }
      for (i = 0; i < 4; ++i) {
  	tmp = mat->mat[i][0];
  	mat->mat[i][0] = mat->mat[i][0] * cosang
Only in sipp-2.0.2/libsipp: patchlevel.h
diff -c -r sipp-2.0.1/libsipp/sipp.c sipp-2.0.2/libsipp/sipp.c
*** sipp-2.0.1/libsipp/sipp.c	Mon May 27 22:52:59 1991
--- sipp-2.0.2/libsipp/sipp.c	Mon May 27 22:47:00 1991
***************
*** 19,24 ****
--- 19,28 ----
   *
   * Revision history:
   *
+  * 910527  Ver. 2.0.2. A major bug in traverse_object_tree() fixed.
+  *         The invers transformation of the eyepoint was not correct, 
+  *         causing polygons erroneously to be marked as backfacing.
+  *
   * 910412  Ver. 2.0.1. Some minor bugfixes. Division by zero in
   *         create_edges() if an edge was horizontal in both x and y.
   *         Free-list became corrupted since the y_bucket was freed
***************
*** 89,95 ****
  #include <geometric.h>
  
  
! #define VERSION "2.0.1"
  
  #define ZCLIPF 100.0        /* Magic number used when defining hither & yon */
  
--- 93,99 ----
  #include <geometric.h>
  
  
! #define VERSION "2.0.2"
  
  #define ZCLIPF 100.0        /* Magic number used when defining hither & yon */
  
***************
*** 1850,1855 ****
--- 1854,1861 ----
      Polygon *polyref;
      Vector   eyepoint, tmp;
      double   loc_view_mat[4][4];
+     double   m[3][4], dtmp;
+     int      i, j;
  
  
      if (object == NULL) {
***************
*** 1873,1884 ****
          tmp.x -= curr_mat.mat[3][0];
          tmp.y -= curr_mat.mat[3][1];
          tmp.z -= curr_mat.mat[3][2];
!         eyepoint.x = (tmp.x * curr_mat.mat[0][0] + tmp.y * curr_mat.mat[0][1]
!                       + tmp.z * curr_mat.mat[0][2]);
!         eyepoint.y = (tmp.x * curr_mat.mat[1][0] + tmp.y * curr_mat.mat[1][1]
!                       + tmp.z * curr_mat.mat[1][2]);
!         eyepoint.z = (tmp.x * curr_mat.mat[2][0] + tmp.y * curr_mat.mat[2][1]
!                       + tmp.z * curr_mat.mat[2][2]);
  
          for (surfref = objref->surfaces; surfref != NULL; 
               surfref = surfref->next) {
--- 1879,1926 ----
          tmp.x -= curr_mat.mat[3][0];
          tmp.y -= curr_mat.mat[3][1];
          tmp.z -= curr_mat.mat[3][2];
!         m[0][0] = curr_mat.mat[0][0] ; m[0][1] = curr_mat.mat[1][0];
!         m[0][2] = curr_mat.mat[2][0] ; m[0][3] = tmp.x;
!         m[1][0] = curr_mat.mat[0][1] ; m[1][1] = curr_mat.mat[1][1];
!         m[1][2] = curr_mat.mat[2][1] ; m[1][3] = tmp.y;
!         m[2][0] = curr_mat.mat[0][2] ; m[2][1] = curr_mat.mat[1][2];
!         m[2][2] = curr_mat.mat[2][2] ; m[2][3] = tmp.z;
! 
!         if (m[0][0] == 0.0) {
!             if (m[1][0] != 0.0)
!                 j = 1;
!             else
!                 j = 2;
!             for (i = 0; i < 4; i++) {
!                 dtmp     = m[0][i];
!                 m[0][i] = m[j][i];
!                 m[j][i] = dtmp;
!             }
!         }
!         
!         for (j = 1; j < 3; j++) {
!             m[j][0] /= (-m[0][0]);
!             for (i = 1; i < 4; i++)
!                 m[j][i] += m[0][i] * m[j][0];
!         }
!         
!         if (m[1][1] == 0.0)
!             for (i = 1; i < 4; i++) {
!                 dtmp     = m[1][i];
!                 m[1][i] = m[2][i];
!                 m[2][i] = dtmp;
!             }
!         
!         if (m[1][1] != 0.0) {
!             m[2][1] /= (-m[1][1]);
!             m[2][2] += m[1][2] * m[2][1];
!             m[2][3] += m[1][3] * m[2][1];
!         }
!         
!         eyepoint.z = m[2][3] / m[2][2];
!         eyepoint.y = (m[1][3] - eyepoint.z * m[1][2]) / m[1][1];
!         eyepoint.x = (m[0][3] - eyepoint.z * m[0][2] 
!                       - eyepoint.y * m[0][1]) / m[0][0];
  
          for (surfref = objref->surfaces; surfref != NULL; 
               surfref = surfref->next) {


exit 0 # Just in case...
-- 
Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
Sterling Software, IMD           UUCP:     uunet!sparky!kent
Phone:    (402) 291-8300         FAX:      (402) 291-4362
Please send comp.sources.misc-related mail to kent@uunet.uu.net.