gzz-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gzz-commits] gzz/gfx/libpaper Paper.cxx Paper.hxx


From: Janne V. Kujala
Subject: [Gzz-commits] gzz/gfx/libpaper Paper.cxx Paper.hxx
Date: Tue, 10 Sep 2002 10:56:00 -0400

CVSROOT:        /cvsroot/gzz
Module name:    gzz
Changes by:     Janne V. Kujala <address@hidden>        02/09/10 10:56:00

Modified files:
        gfx/libpaper   : Paper.cxx Paper.hxx 

Log message:
        Implement vertex program version of TexGenEmboss; currently just 
distorts lighted image by transforming paper coordinates to non-distorted 
vertex coordinates, adding embossing shift, and transforming back to paper 
coordinates. Not tested

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/gfx/libpaper/Paper.cxx.diff?tr1=1.6&tr2=1.7&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/gfx/libpaper/Paper.hxx.diff?tr1=1.7&tr2=1.8&r1=text&r2=text

Patches:
Index: gzz/gfx/libpaper/Paper.cxx
diff -c gzz/gfx/libpaper/Paper.cxx:1.6 gzz/gfx/libpaper/Paper.cxx:1.7
*** gzz/gfx/libpaper/Paper.cxx:1.6      Tue Sep 10 06:49:01 2002
--- gzz/gfx/libpaper/Paper.cxx  Tue Sep 10 10:56:00 2002
***************
*** 3,50 ****
  #include <sstream>
  
  /* define positions of tracked matrices inside the NV vertex program 
registers */
! #define m_p_addr 0  // product of projection and modelview matrices
  #define paper_addr 4 // object-to-paper-coordinate mapping matrix
  
  namespace Paper {
      TexGen::TexGen(const float *tex_mat) {
!       svec[0] = tex_mat[0];
!       svec[1] = tex_mat[1];
!       svec[2] = tex_mat[2];
!       svec[3] = tex_mat[3];
! 
!       tvec[0] = tex_mat[4];
!       tvec[1] = tex_mat[5];
!       tvec[2] = tex_mat[6];
!       tvec[3] = tex_mat[7];
! 
!       rvec[0] = tex_mat[8];
!       rvec[1] = tex_mat[9];
!       rvec[2] = tex_mat[10];
!       rvec[3] = tex_mat[11];
! 
!       qvec[0] = 0;
!       qvec[0] = 0;
!       qvec[0] = 0;
!       qvec[0] = 1;
      }
  
      void TexGen::setUpVP(int unit, LightParam * param) {
        // XXX: This could also be implemented as CallGL code
  #ifdef GL_VERTEX_PROGRAM_NV
!       GLuint base = unit * 4 + 60;
!       glProgramParameter4fvNV(GL_VERTEX_PROGRAM_NV, base + 0, svec);
!       glProgramParameter4fvNV(GL_VERTEX_PROGRAM_NV, base + 1, tvec);
!       glProgramParameter4fvNV(GL_VERTEX_PROGRAM_NV, base + 2, rvec);
!       glProgramParameter4fvNV(GL_VERTEX_PROGRAM_NV, base + 3, qvec);
  #endif
      }
    
      string TexGen::getVPCode(int unit) {
-       GLuint base = unit * 4 + 60;
-       
        std::ostringstream code;
  
        code << "DP4 o[TEX" << unit << "].x, c[" << base + 0 << "], v[TEX0]\n" 
           << "DP4 o[TEX" << unit << "].y, c[" << base + 1 << "], v[TEX0]\n" 
           << "DP4 o[TEX" << unit << "].z, c[" << base + 2 << "], v[TEX0]\n"
--- 3,52 ----
  #include <sstream>
  
  /* define positions of tracked matrices inside the NV vertex program 
registers */
! #define m_p_addr   0 // product of projection and modelview matrices
  #define paper_addr 4 // object-to-paper-coordinate mapping matrix
  
+ /* the matrix that maps v[TEX0] into o[TEXi] is stored starting at 
c[tex_addr_base + 4*i] */
+ #define tex_addr_base 60 // texture matrix
+ 
  namespace Paper {
      TexGen::TexGen(const float *tex_mat) {
!       this->tex_mat[0] = tex_mat[0];
!       this->tex_mat[1] = tex_mat[1];
!       this->tex_mat[2] = tex_mat[2];
!       this->tex_mat[3] = tex_mat[3];
! 
!       this->tex_mat[4] = tex_mat[4];
!       this->tex_mat[5] = tex_mat[5];
!       this->tex_mat[6] = tex_mat[6];
!       this->tex_mat[7] = tex_mat[7];
! 
!       this->tex_mat[8] = tex_mat[8];
!       this->tex_mat[9] = tex_mat[9];
!       this->tex_mat[10] = tex_mat[10];
!       this->tex_mat[11] = tex_mat[11];
! 
!       this->tex_mat[12] = 0;
!       this->tex_mat[13] = 0;
!       this->tex_mat[14] = 0;
!       this->tex_mat[15] = 1;
      }
  
      void TexGen::setUpVP(int unit, LightParam * param) {
        // XXX: This could also be implemented as CallGL code
  #ifdef GL_VERTEX_PROGRAM_NV
!       GLuint base = unit * 4 + tex_addr_base;
!       glProgramParameter4fvNV(GL_VERTEX_PROGRAM_NV, base + 0, tex_mat);
!       glProgramParameter4fvNV(GL_VERTEX_PROGRAM_NV, base + 1, tex_mat + 4);
!       glProgramParameter4fvNV(GL_VERTEX_PROGRAM_NV, base + 2, tex_mat + 8);
!       glProgramParameter4fvNV(GL_VERTEX_PROGRAM_NV, base + 3, tex_mat + 12);
  #endif
      }
    
      string TexGen::getVPCode(int unit) {
        std::ostringstream code;
  
+       GLuint base = unit * 4 + tex_addr_base;
        code << "DP4 o[TEX" << unit << "].x, c[" << base + 0 << "], v[TEX0]\n" 
           << "DP4 o[TEX" << unit << "].y, c[" << base + 1 << "], v[TEX0]\n" 
           << "DP4 o[TEX" << unit << "].z, c[" << base + 2 << "], v[TEX0]\n"
***************
*** 65,117 ****
  
        glEnable(GL_TEXTURE_2D);
        glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
!       glTexGenfv(GL_S, GL_EYE_PLANE, svec);
        glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
!       glTexGenfv(GL_T, GL_EYE_PLANE, tvec);
        glTexGenf(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
!       glTexGenfv(GL_R, GL_EYE_PLANE, rvec);
        glEnable(GL_TEXTURE_GEN_S);
        glEnable(GL_TEXTURE_GEN_T);
        glEnable(GL_TEXTURE_GEN_R);
        glPopMatrix();
        }
  
!     void TexGenEmboss::setUpVP(int unit, LightParam * param) {
!       TexGen::setUpVP(unit, param);
  
!       float mat0[16];
!       glGetFloatv(GL_MODELVIEW_MATRIX, mat0);
  
!       float mat[16] = { param->e0.x, param->e0.y, param->e0.z, 0,
!                       param->e1.x, param->e1.y, param->e1.z, 0,
!                       param->e2.x, param->e2.y, param->e2.z, 0,
!                       param->orig.x, param->orig.y, param->orig.z, 1 };
! 
!       glMatrixMode(GL_MATRIX0_NV);
!       glLoadMatrixf(mat0);
!       glMultMatrixf(mat);
!       glMatrixMode(GL_MODELVIEW);
  
!       glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, paper_addr, GL_MATRIX0_NV, 
GL_INVERSE_TRANSPOSE_NV);
  
!     }
!   
  
!     string TexGenEmboss::getVPCode(int unit) {
!       GLuint base = unit * 4 + 60;
!       
!       std::ostringstream code;
  
!       code << "DP4 o[TEX" << unit << "].x, c[" << base + 0 << "], v[TEX0]\n" 
!          << "DP4 o[TEX" << unit << "].y, c[" << base + 1 << "], v[TEX0]\n" 
!          << "DP4 o[TEX" << unit << "].z, c[" << base + 2 << "], v[TEX0]\n"
!            << "DP4 o[TEX" << unit << "].w, c[" << base + 3 << "], v[TEX0]\n";
  
!       // XXX: compute embossing shift
  
!       return code.str();
!     }
  
  
        void TexGenEmboss::setUp(LightParam *param) {
        glMatrixMode(GL_MODELVIEW);
--- 67,144 ----
  
        glEnable(GL_TEXTURE_2D);
        glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
!       glTexGenfv(GL_S, GL_EYE_PLANE, tex_mat);
        glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
!       glTexGenfv(GL_T, GL_EYE_PLANE, tex_mat + 4);
        glTexGenf(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
!       glTexGenfv(GL_R, GL_EYE_PLANE, tex_mat + 8);
        glEnable(GL_TEXTURE_GEN_S);
        glEnable(GL_TEXTURE_GEN_T);
        glEnable(GL_TEXTURE_GEN_R);
        glPopMatrix();
        }
  
!       void TexGenEmboss::setUpVP(int unit, LightParam *param) {
!       // Suppose 
!         //   x = vertex position
!       //   p = paper coordinates
!       //   s = texture coordinates
!       //   A = paper-to-vertex mapping
!       //   E = embossing mapping (translates x towards light)
!       //   M = modelview matrix
!       //   T = texture matrix
!       //
!       // The usual eye-linear embossing texgen computes
!       //   s' = Tp' = T((MEA)^-1 M x) = T(A^-1 E^-1 x)
!       // The usual simple texgen computes
!       //   s = Tp = T((MA)^-1 M x) = T(A^-1 x)  ==>  x = Ap
!       // Thus, the mapping from p to s' is
!       //   s' = Tp' = T(A^-1 E^-1 x) = T A^-1 E^-1 A p
!       // 
!       // The following code computes T A^-1 E^-1 A and stores it
!       // in place of T in the constant registers
  
!         GLuint base = unit * 4 + tex_addr_base;
  
!         glMatrixMode(GL_MATRIX0_NV);
!         glLoadIdentity();
  
!       float eps = this->eps * param->e2.dot(param->e2) 
!         / (param->Light - param->Light_w * param->orig).dot(param->e2);
!       
!       glTranslatef(eps * param->Light.x, eps * param->Light.y, eps * 
param->Light.z);
!       float s = 1 - param->Light_w * eps;
!       glScalef(s, s, s);
!       
!       float mat[16] = { param->e0.x, param->e0.y, param->e0.z, 0,
!                         param->e1.x, param->e1.y, param->e1.z, 0,
!                         param->e2.x, param->e2.y, param->e2.z, 0,
!                         param->orig.x, param->orig.y, param->orig.z, 1 };
  
!       glMultMatrixf(mat);
  
!       // Hack for easily inverting the matrix
!       glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, base, GL_MATRIX0_NV, 
GL_INVERSE_NV);
!       glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, base, GL_NONE, GL_INVERSE_NV);
!       float foo[16];
!       glGetProgramParameterfvNV(GL_VERTEX_PROGRAM_NV, base + 0, 
GL_PROGRAM_PARAMETER_NV, foo);
!       glGetProgramParameterfvNV(GL_VERTEX_PROGRAM_NV, base + 1, 
GL_PROGRAM_PARAMETER_NV, foo + 4);
!       glGetProgramParameterfvNV(GL_VERTEX_PROGRAM_NV, base + 2, 
GL_PROGRAM_PARAMETER_NV, foo + 8);
!       glGetProgramParameterfvNV(GL_VERTEX_PROGRAM_NV, base + 3, 
GL_PROGRAM_PARAMETER_NV, foo + 12);
!       glLoadMatrixf(foo);
  
!       glMultMatrixf(mat);
  
!       glMultMatrixf(tex_mat);
  
!       // Load the current matrix in c[base:base+4]
!       glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, base, GL_MATRIX0_NV, 
GL_IDENTITY_NV);
!       glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, base, GL_NONE, GL_IDENTITY_NV);
!       
!       glMatrixMode(GL_MODELVIEW);
  
+       }
+   
  
        void TexGenEmboss::setUp(LightParam *param) {
        glMatrixMode(GL_MODELVIEW);
***************
*** 132,140 ****
  
        glEnable(GL_TEXTURE_2D);
        glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
!       glTexGenfv(GL_S, GL_EYE_PLANE, svec);
        glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
!       glTexGenfv(GL_T, GL_EYE_PLANE, tvec);
        glEnable(GL_TEXTURE_GEN_S);
        glEnable(GL_TEXTURE_GEN_T);
        glPopMatrix();
--- 159,167 ----
  
        glEnable(GL_TEXTURE_2D);
        glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
!       glTexGenfv(GL_S, GL_EYE_PLANE, tex_mat);
        glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
!       glTexGenfv(GL_T, GL_EYE_PLANE, tex_mat + 4);
        glEnable(GL_TEXTURE_GEN_S);
        glEnable(GL_TEXTURE_GEN_T);
        glPopMatrix();
***************
*** 174,182 ****
  
        glEnable(GL_TEXTURE_2D);
        glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
!       glTexGenfv(GL_S, GL_EYE_PLANE, svec);
        glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
!       glTexGenfv(GL_T, GL_EYE_PLANE, tvec);
        glEnable(GL_TEXTURE_GEN_S);
        glEnable(GL_TEXTURE_GEN_T);
        glPopMatrix();
--- 201,209 ----
  
        glEnable(GL_TEXTURE_2D);
        glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
!       glTexGenfv(GL_S, GL_EYE_PLANE, tex_mat);
        glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
!       glTexGenfv(GL_T, GL_EYE_PLANE, tex_mat + 4);
        glEnable(GL_TEXTURE_GEN_S);
        glEnable(GL_TEXTURE_GEN_T);
        glPopMatrix();
***************
*** 246,252 ****
          loadVP();
  
        /* Track the product of modelview and projection matrices */
!       glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, m_p_addr, GL_MATRIX0_NV, 
GL_MODELVIEW_PROJECTION_NV);
  
        /* Set up VP TexGen parameters for each texture unit */
          int unit = 0;
--- 273,279 ----
          loadVP();
  
        /* Track the product of modelview and projection matrices */
!       glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, m_p_addr, 
GL_MODELVIEW_PROJECTION_NV, GL_IDENTITY_NV);
  
        /* Set up VP TexGen parameters for each texture unit */
          int unit = 0;
Index: gzz/gfx/libpaper/Paper.hxx
diff -c gzz/gfx/libpaper/Paper.hxx:1.7 gzz/gfx/libpaper/Paper.hxx:1.8
*** gzz/gfx/libpaper/Paper.hxx:1.7      Tue Sep 10 06:49:01 2002
--- gzz/gfx/libpaper/Paper.hxx  Tue Sep 10 10:56:00 2002
***************
*** 76,85 ****
       */
      class TexGen : public LightSetup {
      protected:
!       float svec[4];
!       float tvec[4];
!       float rvec[4];
!       float qvec[4]; // XXX: Currently always initialized to 0,0,0,1
  
      public:
        /** Create a new texgen.
--- 76,83 ----
       */
      class TexGen : public LightSetup {
      protected:
!       // XXX: Currently the last four values are always initialized to 0,0,0,1
!       float tex_mat[16];
  
      public:
        /** Create a new texgen.
***************
*** 111,117 ****
        virtual void setUp(LightParam *param) ;
  
        virtual void setUpVP(int unit, LightParam * param);
-       virtual string getVPCode(int unit);
      };
  
      /** TexGen for transforming light intensity or direction map 
--- 109,114 ----
***************
*** 180,187 ****
  
  
        /** Vertex Program Version of the rendering interface 
-        * XXX: currently only plain TexGens are implemented
-        * Note: most fields of *param will be ignored
         */
        void setUpVP(LightParam *param);
        void tearDownVP();
--- 177,182 ----




reply via email to

[Prev in Thread] Current Thread [Next in Thread]