[Top][All Lists]
[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 ----