/*ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ*\ File: General vertex program pipeline Author: Magnus Högdahl Copyright: Starbreeze Studios 2001 Comments: This file implements a vertex processing pipeline that provide all functionality found in a standard fixed function pipeline that is required by GL/D3D rendering contexts. In addition to emulating the fixed pipeline, the vertex program pipeline provide functionality such as matrix palette transformation and new texture coordinate generation modes. Vertex programs are assembled using defines to enable and disable program segments from this source file. History: 010830: Created File 011011 Depth fog calculation corrected. \*____________________________________________________________________________________________*/ /*************************************************************************************************\ |ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ | Comments |__________________________________________________________________________________________________ \*************************************************************************************************/ /* Dynamic constants: $MP Matrix palette $LIGHT Lights $TEXPARAMx Texture coordinate generation parameters, x = [0..CRC_MAXTEXTURE[ $TEXMATRIXx Texture transform matrix, x = [0..CRC_MAXTEXTURE[ $CONSTANTCOLOR Constant color Registers: R0 If matrixpalette: Vertex 4x3 transform. (Model-space to animated model-space) R1 If matrixpalette: Vertex 4x3 transform. (Model-space to animated model-space) R2 If matrixpalette: Vertex 4x3 transform. (Model-space to animated model-space) R8 Model-space vertex position. (After MP transform) R9 Model-space normal. (if lighting is enabled) R10 Diffuse color. (if lighting is enabled) R11 Specular color. (if lighting is enabled) (NOT IMPLEMENTED) Static constants: c[0..3] Model*Projection (Model-space to clip-space) c[4..7] Model (Model-space to view-space) c[8].x 0.0f c[8].y 1.0f c[8].z 0.5f c[8].w 2*255.0001f // Bone index multiplier. 8 Point lights + MWComp4 + 4*(TexGen + TexTransform) == 123 instructions, room left for 14 MP matrices. Quaternion -> Matrix: T xs,ys,zs,wx,wy,wz,xx,xy,xz,yy,yz,zz; T s = 2.0; xs = k[0]*s; ys = k[1]*s; zs = k[2]*s; wx = k[3]*xs; wy = k[3]*ys; wz = k[3]*zs; xx = k[0]*xs; xy = k[0]*ys; xz = k[0]*zs; yy = k[1]*ys; yz = k[1]*zs; zz = k[2]*zs; R8 * _Mat.k[0][0] = (1.0 - (yy+zz)); _Mat.k[0][1] = (xy-wz); * _Mat.k[0][2] = (xz+wy); R9 * _Mat.k[1][0] = (xy+wz); * _Mat.k[1][1] = (1.0 - (xx+zz)); _Mat.k[1][2] = (yz-wx); R10 _Mat.k[2][0] = (xz-wy); _Mat.k[2][1] = (yz+wx); * _Mat.k[2][2] = (1.0 - (xx+yy)); ADD R4, c[A0.x+$MP+0], c[A0.x+$MP+0]; MUL R5, R4.xyzz, c[A0.x+$MP+0].xxxx; // xx = k[0]*xs; xy = k[0]*ys; xz = k[0]*zs; MUL R6, R4.yzzz, c[A0.x+$MP+0].yyzz; // yy = k[1]*ys; yz = k[1]*zs; zz = k[2]*zs; MUL R4, R4.xyzz, c[A0.x+$MP+0].wwww; // wx = k[3]*xs; wy = k[3]*ys; wz = k[3]*zs; ADD R8.x, R6.xxxx, R6.zzzz; // yy+zz ADD R8.x, c[8].y, -R8.x; // 1 - yy+zz ADD R9, R5.yzzz, R4.zyyy; // R9.x = xy+wz, R9.y = xz+wy ADD R10, c[8].y, -R5.x; // R10 = 1 - xx MOV R8.z, R9.y; // R8.z = R9.y = xz+wy ADD R10, R10, -R6.zxxx; // R10.x = 1 - xx - zz, R10.yzw = 1 - xx - yy ADD R8.y, R5.y, -R4.z; ADD R9.z, R6.y, -R4.x; MOV R9.y, R10.x; ADD R10.x, R5.z, -R4.y; ADD R10.y, R6.y, R4.x; */ /*************************************************************************************************\ |ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ | Vertex program source |__________________________________________________________________________________________________ \*************************************************************************************************/ *VertexProgram { *vpheader "@HEADER " // ---------------------------------------------------------------- // Matrix palette transform // ---------------------------------------------------------------- *if_MWComp0 " MOV R8, @V_POS; MOV R9, @V_NRML; DP3 R3.w, R9, R9; RSQ R3.w, R3.w; MUL R9.xyz, R9, R3.w; " /* DP3 R3.w, R9, R9; RSQ R3.w, R3.w; MUL R9.xyz, R9, R3.w; */ *if_MWComp1 " MUL R3, @V_MI, c[8].w; @ARL A0.x, R3.x; MUL R0, @V_MW.x, c[A0.x+$MP+0]; MUL R1, @V_MW.x, c[A0.x+$MP+1]; MUL R2, @V_MW.x, c[A0.x+$MP+2]; DP4 R8.x, R0, @V_POS; DP4 R8.y, R1, @V_POS; DP4 R8.z, R2, @V_POS; MOV R8.w, @V_POS.w; " *if_MWComp2 " MUL R3, @V_MI, c[8].w; @ARL A0.x, R3.x; MUL R0, @V_MW.x, c[A0.x+$MP+0]; MUL R1, @V_MW.x, c[A0.x+$MP+1]; MUL R2, @V_MW.x, c[A0.x+$MP+2]; @ARL A0.x, R3.y; MAD R0, @V_MW.y, c[A0.x+$MP+0], R0; MAD R1, @V_MW.y, c[A0.x+$MP+1], R1; MAD R2, @V_MW.y, c[A0.x+$MP+2], R2; DP4 R8.x, R0, @V_POS; DP4 R8.y, R1, @V_POS; DP4 R8.z, R2, @V_POS; MOV R8.w, @V_POS.w; " *if_MWComp3 " MUL R3, @V_MI, c[8].w; @ARL A0.x, R3.x; ADD R4, c[A0.x+$MP+0], c[A0.x+$MP+0]; MUL R5, R4.xyzz, c[A0.x+$MP+0].xxxx; MUL R6, R4.yzzz, c[A0.x+$MP+0].yyzz; MUL R4, R4.xyzz, c[A0.x+$MP+0].wwww; ADD R8.x, R6.xxxx, R6.zzzz; ADD R8.x, c[8].y, -R8.x; ADD R9, R5.yzzz, R4.zyyy; ADD R10, c[8].y, -R5.x; MOV R8.z, R9.y; ADD R10, R10, -R6.zxxx; ADD R8.y, R5.y, -R4.z; ADD R9.z, R6.y, -R4.x; MOV R9.y, R10.x; ADD R10.x, R5.z, -R4.y; ADD R10.y, R6.y, R4.x; MOV R8.w, c[A0.x+$MP+1].x; MOV R9.w, c[A0.x+$MP+1].y; MOV R10.w, c[A0.x+$MP+1].z; MUL R0, @V_MW.x, R8; MUL R1, @V_MW.x, R9; MUL R2, @V_MW.x, R10; @ARL A0.x, R3.y; ADD R4, c[A0.x+$MP+0], c[A0.x+$MP+0]; MUL R5, R4.xyzz, c[A0.x+$MP+0].xxxx; MUL R6, R4.yzzz, c[A0.x+$MP+0].yyzz; MUL R4, R4.xyzz, c[A0.x+$MP+0].wwww; ADD R8.x, R6.xxxx, R6.zzzz; ADD R8.x, c[8].y, -R8.x; ADD R9, R5.yzzz, R4.zyyy; ADD R10, c[8].y, -R5.x; MOV R8.z, R9.y; ADD R10, R10, -R6.zxxx; ADD R8.y, R5.y, -R4.z; ADD R9.z, R6.y, -R4.x; MOV R9.y, R10.x; ADD R10.x, R5.z, -R4.y; ADD R10.y, R6.y, R4.x; MOV R8.w, c[A0.x+$MP+1].x; MOV R9.w, c[A0.x+$MP+1].y; MOV R10.w, c[A0.x+$MP+1].z; MAD R0, @V_MW.y, R8, R0; MAD R1, @V_MW.y, R9, R1; MAD R2, @V_MW.y, R10, R2; @ARL A0.x, R3.z; ADD R4, c[A0.x+$MP+0], c[A0.x+$MP+0]; MUL R5, R4.xyzz, c[A0.x+$MP+0].xxxx; MUL R6, R4.yzzz, c[A0.x+$MP+0].yyzz; MUL R4, R4.xyzz, c[A0.x+$MP+0].wwww; ADD R8.x, R6.xxxx, R6.zzzz; ADD R8.x, c[8].y, -R8.x; ADD R9, R5.yzzz, R4.zyyy; ADD R10, c[8].y, -R5.x; MOV R8.z, R9.y; ADD R10, R10, -R6.zxxx; ADD R8.y, R5.y, -R4.z; ADD R9.z, R6.y, -R4.x; MOV R9.y, R10.x; ADD R10.x, R5.z, -R4.y; ADD R10.y, R6.y, R4.x; MOV R8.w, c[A0.x+$MP+1].x; MOV R9.w, c[A0.x+$MP+1].y; MOV R10.w, c[A0.x+$MP+1].z; MAD R0, @V_MW.z, R8, R0; MAD R1, @V_MW.z, R9, R1; MAD R2, @V_MW.z, R10, R2; DP4 R8.x, R0, @V_POS; DP4 R8.y, R1, @V_POS; DP4 R8.z, R2, @V_POS; MOV R8.w, @V_POS.w; " *if_MWComp4 " MUL R3, @V_MI, c[8].w; @ARL A0.x, R3.x; MUL R0, @V_MW.x, c[A0.x+$MP+0]; MUL R1, @V_MW.x, c[A0.x+$MP+1]; MUL R2, @V_MW.x, c[A0.x+$MP+2]; @ARL A0.x, R3.y; MAD R0, @V_MW.y, c[A0.x+$MP+0], R0; MAD R1, @V_MW.y, c[A0.x+$MP+1], R1; MAD R2, @V_MW.y, c[A0.x+$MP+2], R2; @ARL A0.x, R3.z; MAD R0, @V_MW.z, c[A0.x+$MP+0], R0; MAD R1, @V_MW.z, c[A0.x+$MP+1], R1; MAD R2, @V_MW.z, c[A0.x+$MP+2], R2; @ARL A0.x, R3.w; MAD R0, @V_MW.w, c[A0.x+$MP+0], R0; MAD R1, @V_MW.w, c[A0.x+$MP+1], R1; MAD R2, @V_MW.w, c[A0.x+$MP+2], R2; DP4 R8.x, R0, @V_POS; DP4 R8.y, R1, @V_POS; DP4 R8.z, R2, @V_POS; MOV R8.w, @V_POS.w; " *ifnot_MWComp0 // TODO: We should have some logic that enable normal transform only when it is needed. " DP3 R9.x, R0, @V_NRML; DP3 R9.y, R1, @V_NRML; DP3 R9.z, R2, @V_NRML; DP3 R3.w, R9, R9; RSQ R3.w, R3.w; MUL R9.xyz, R9, R3.w; " // ---------------------------------------------------------------- // Fog // ---------------------------------------------------------------- *if_fogdepth " DP4 @O_FOG, c[6], R8; " // ---------------------------------------------------------------- // Lighting // ---------------------------------------------------------------- *if_lighting { *LightBegin " MOV R10.xyzw, c[8].xxxy; " // ---------------------------------------------------------------- // Point light 0 ($LIGHT+0 == LightPos (ViewSpace), $LIGHT+1 == Color) *if_Light0_Point " ADD R4, c[$LIGHT+0], -R8; DP3 R3.w, R4, R4; RSQ R3.z, R3.w; DST R3, R3.w, R3.z; MUL R3.x, c[$LIGHT+0].wwww, -R3.yyyy; ADD R3.x, R3.x, c[8].yyyy; MAX R3.x, R3.x, c[8].x; MUL R4.w, R3.w, R3.x; MUL R4.xyz, R4, R4.w; DP3 R3.x, R9, R4; MAX R3.x, R3.x, c[8].x; MUL R10.xyz, R3.xxxx, c[$LIGHT+1]; " // ---------------------------------------------------------------- // Ambient light 0 ($LIGHT+0 == Unused, $LIGHT+1 == Color) *if_Light0_Ambient " MOV R10.xyz, c[$LIGHT+1]; " // ---------------------------------------------------------------- // Parallell light 0 ($LIGHT+0 == LightVector (ViewSpace), $LIGHT+1 == Color) *if_Light0_Parallell " DP3 R3.x, R9, c[$LIGHT+0]; MUL R10.xyz, R3.xxxx, c[$LIGHT+1]; " // ---------------------------------------------------------------- // Point light 1-7 ($LIGHT+0 == LightPos (ViewSpace), $LIGHT+1 == Color) *if_Light1_Point " ADD R4, c[$LIGHT+2], -R8; DP3 R3.w, R4, R4; RSQ R3.z, R3.w; DST R3, R3.w, R3.z; MUL R3.x, c[$LIGHT+2].wwww, -R3.yyyy; ADD R3.x, R3.x, c[8].yyyy; MAX R3.x, R3.x, c[8].x; MUL R4.w, R3.w, R3.x; MUL R4.xyz, R4, R4.w; DP3 R3.x, R9, R4; MAX R3.x, R3.x, c[8].x; MAD R10.xyz, R3.xxxx, c[$LIGHT+3], R10; " *if_Light2_Point " ADD R4, c[$LIGHT+4], -R8; DP3 R3.w, R4, R4; RSQ R3.z, R3.w; DST R3, R3.w, R3.z; MUL R3.x, c[$LIGHT+4].wwww, -R3.yyyy; ADD R3.x, R3.x, c[8].yyyy; MAX R3.x, R3.x, c[8].x; MUL R4.w, R3.w, R3.x; MUL R4.xyz, R4, R4.w; DP3 R3.x, R9, R4; MAX R3.x, R3.x, c[8].x; MAD R10.xyz, R3.xxxx, c[$LIGHT+5], R10; " *if_Light3_Point " ADD R4, c[$LIGHT+6], -R8; DP3 R3.w, R4, R4; RSQ R3.z, R3.w; DST R3, R3.w, R3.z; MUL R3.x, c[$LIGHT+6].wwww, -R3.yyyy; ADD R3.x, R3.x, c[8].yyyy; MAX R3.x, R3.x, c[8].x; MUL R4.w, R3.w, R3.x; MUL R4.xyz, R4, R4.w; DP3 R3.x, R9, R4; MAX R3.x, R3.x, c[8]; MAD R10.xyz, R3.xxxx, c[$LIGHT+7], R10; " *if_Light4_Point " ADD R4, c[$LIGHT+8], -R8; DP3 R3.w, R4, R4; RSQ R3.z, R3.w; DST R3, R3.w, R3.z; MUL R3.x, c[$LIGHT+8].wwww, -R3.yyyy; ADD R3.x, R3.x, c[8].yyyy; MAX R3.x, R3.x, c[8].x; MUL R4.w, R3.w, R3.x; MUL R4.xyz, R4, R4.w; DP3 R3.x, R9, R4; MAX R3.x, R3.x, c[8].x; MAD R10.xyz, R3.xxxx, c[$LIGHT+9], R10; " *if_Light5_Point " ADD R4, c[$LIGHT+10], -R8; DP3 R3.w, R4, R4; RSQ R3.z, R3.w; DST R3, R3.w, R3.z; MUL R3.x, c[$LIGHT+10].wwww, -R3.yyyy; ADD R3.x, R3.x, c[8].yyyy; MAX R3.x, R3.x, c[8].x; MUL R4.w, R3.w, R3.x; MUL R4.xyz, R4, R4.w; DP3 R3.x, R9, R4; MAX R3.x, R3.x, c[8].x; MAD R10.xyz, R3.xxxx, c[$LIGHT+11], R10; " *if_Light6_Point " ADD R4, c[$LIGHT+12], -R8; DP3 R3.w, R4, R4; RSQ R3.z, R3.w; DST R3, R3.w, R3.z; MUL R3.x, c[$LIGHT+12].wwww, -R3.yyyy; ADD R3.x, R3.x, c[8].yyyy; MAX R3.x, R3.x, c[8].x; MUL R4.w, R3.w, R3.x; MUL R4.xyz, R4, R4.w; DP3 R3.x, R9, R4; MAX R3.x, R3.x, c[8].x; MAD R10.xyz, R3.xxxx, c[$LIGHT+13], R10; " *if_Light7_Point " ADD R4, c[$LIGHT+14], -R8; DP3 R3.w, R4, R4; RSQ R3.z, R3.w; DST R3, R3.w, R3.z; MUL R3.x, c[$LIGHT+14].wwww, -R3.yyyy; ADD R3.x, R3.x, c[8].yyyy; MAX R3.x, R3.x, c[8].x; MUL R4.w, R3.w, R3.x; MUL R4.xyz, R4, R4.w; DP3 R3.x, R9, R4; MAX R3.x, R3.x, c[8].x; MAD R10.xyz, R3.xxxx, c[$LIGHT+15], R10; " // ---------------------------------------------------------------- // Ambient light 1-7 ($LIGHT+0 == Unused, $LIGHT+1 == Color) *if_Light1_Ambient " ADD R10, R10, c[$LIGHT+3]; " *if_Light2_Ambient " ADD R10, R10, c[$LIGHT+5]; " *if_Light3_Ambient " ADD R10, R10, c[$LIGHT+7]; " *if_Light4_Ambient " ADD R10, R10, c[$LIGHT+9]; " *if_Light5_Ambient " ADD R10, R10, c[$LIGHT+11]; " *if_Light6_Ambient " ADD R10, R10, c[$LIGHT+13]; " *if_Light7_Ambient " ADD R10, R10, c[$LIGHT+15]; " // ---------------------------------------------------------------- // Parallell light 1-7 ($LIGHT+0 == LightVector (ViewSpace), $LIGHT+1 == Color) *if_Light1_Parallell " DP3 R3.x, R9, c[$LIGHT+2]; MAD R10.xyz, R3.xxxx, c[$LIGHT+3], R10; " *if_Light2_Parallell " DP3 R3.x, R9, c[$LIGHT+4]; MAD R10.xyz, R3.xxxx, c[$LIGHT+5], R10; " *if_Light3_Parallell " DP3 R3.x, R9, c[$LIGHT+6]; MAD R10.xyz, R3.xxxx, c[$LIGHT+7], R10; " *if_Light4_Parallell " DP3 R3.x, R9, c[$LIGHT+8]; MAD R10.xyz, R3.xxxx, c[$LIGHT+9], R10; " *if_Light5_Parallell " DP3 R3.x, R9, c[$LIGHT+10]; MAD R10.xyz, R3.xxxx, c[$LIGHT+11], R10; " *if_Light6_Parallell " DP3 R3.x, R9, c[$LIGHT+12]; MAD R10.xyz, R3.xxxx, c[$LIGHT+13], R10; " *if_Light7_Parallell " DP3 R3.x, R9, c[$LIGHT+14]; MAD R10.xyz, R3.xxxx, c[$LIGHT+15], R10; " *clamplight " MAX R10, R10, c[8].x; " *if_colorvertex " MUL R10, R10, @V_COL0; " *storecolor " MUL @O_COL0, R10, c[$CONSTANTCOLOR]; " // ---------------------------------------------------------------- *modelprojection " DP4 @O_HPOS.x, c[0], R8; DP4 @O_HPOS.y, c[1], R8; DP4 @O_HPOS.z, c[2], R8; DP4 @O_HPOS.w, c[3], R8; " } *ifnot_lighting { *modelprojection " DP4 @O_HPOS.x, c[0], R8; DP4 @O_HPOS.y, c[1], R8; DP4 @O_HPOS.z, c[2], R8; DP4 @O_HPOS.w, c[3], R8; " *if_colorvertex " MUL @O_COL0, @V_COL0, c[$CONSTANTCOLOR]; " *ifnot_colorvertex " MOV @O_COL0, c[$CONSTANTCOLOR]; " } // ---------------------------------------------------------------- // Texture coordinate generation and transform // ---------------------------------------------------------------- *ifnot_texgen0_void { *if_texgen0_texcoord { *if_texmatrix0 " DP4 @O_TEX0.x, $TEXINPUT0, c[$TEXMATRIX0+0]; DP4 @O_TEX0.y, $TEXINPUT0, c[$TEXMATRIX0+1]; DP4 @O_TEX0.z, $TEXINPUT0, c[$TEXMATRIX0+2]; DP4 @O_TEX0.w, $TEXINPUT0, c[$TEXMATRIX0+3]; " *ifnot_texmatrix0 " MOV @O_TEX0, $TEXINPUT0; " } *ifnot_texgen0_texcoord { *if_texgen0_linear " DP4 R3.x, R8, c[$TEXPARAM0+0]; DP4 R3.y, R8, c[$TEXPARAM0+1]; DP4 R3.z, R8, c[$TEXPARAM0+2]; DP4 R3.w, R8, c[$TEXPARAM0+3]; " *if_texgen0_linearnhf " MOV R4, c[$TEXPARAM0+1]; MOV R4.w, c[8].y; ADD R5, R4, -R8; DP3 R3.x, R8, c[$TEXPARAM0+0]; ADD R3.x, R3.x, c[$TEXPARAM0+0].w; DP4 R3.y, R4, c[$TEXPARAM0+0]; ADD R3.w, R3.x, -R3.y; RCP R3.w, R3.w; MIN R3.y, R3.y, c[8].x; MUL R3.y, R3.y, R3.w; MUL R5, R5, R3.y; ADD R4, R4, R5; ADD R5, R4, -R8; DP3 R3.y, R4, c[$TEXPARAM0+0]; ADD R3.y, R3.y, c[$TEXPARAM0+0].w; MIN R3.xy, R3, c[8].yyyy; MAX R3.xy, R3, c[8].xxxx; ADD R3.x, R3.x, R3.y; DP3 R4.w, R5, R5; RSQ R4.w, R4.w; RCP R4.w, R4.w; MUL R3.x, R3.x, R4.w; MUL R3.x, R3.x, c[$TEXPARAM0+1].w; MOV R3.yzw, c[8].yyyy; MOV @O_COL0, c[$TEXPARAM0+2]; " *if_texgen0_boxnhf " ADD R3, R8, -c[$TEXPARAM0+8]; MUL R3, R3, c[$TEXPARAM0+9]; MAX R3, R3, c[8].xxxx; MIN R3, R3, c[8].yyyy; MOV R10, c[$TEXPARAM0+1]; ADD R4, -c[$TEXPARAM0+0], R10; MAD R5, R4, R3.xxxx, c[$TEXPARAM0+0]; MOV R10, c[$TEXPARAM0+3]; ADD R4, -c[$TEXPARAM0+2], R10; MAD R6, R4, R3.xxxx, c[$TEXPARAM0+2]; ADD R4, -R5, R6; MAD R7, R4, R3.yyyy, R5; MOV R10, c[$TEXPARAM0+5]; ADD R4, -c[$TEXPARAM0+4], R10; MAD R5, R4, R3.xxxx, c[$TEXPARAM0+4]; MOV R10, c[$TEXPARAM0+7]; ADD R4, -c[$TEXPARAM0+6], R10; MAD R6, R4, R3.xxxx, c[$TEXPARAM0+6]; ADD R4, -R5, R6; MAD R6, R4, R3.yyyy, R5; ADD R4, -R7, R5; MAD R7, R4, R3.zzzz, R7; MOV R3, R7.w; MOV R3.yzw, c[8].yyyy; MOV R7.w, c[8].y; MOV @O_COL0, R7; " *if_texgen0_normalmap " MOV R3, R9; " *if_texgen0_reflection " DP4 R3.x, R8, c[4]; DP4 R3.y, R8, c[5]; DP4 R3.z, R8, c[6]; MOV R3.w, c[8].x; DP3 R4.x, R9, c[4]; DP3 R4.y, R9, c[5]; DP3 R4.z, R9, c[6]; MOV R4.w, c[8].x; DP3 R3.w, -R3, R4; ADD R3.w, R3.w, R3.w; MUL R4, R4, R3.wwww; ADD R3, R3, R4; MOV R3.w, c[8].x; " *if_texgen0_env " MOV R3, $TEXINPUT0; DP3 R3.x, R9, c[4]; DP3 R3.y, -R9, c[5]; MUL R3, R3, c[8].zzzz; ADD R3, R3, c[8].zzzz; " *if_texgen0_tslv " ADD R4, c[$TEXPARAM0+0], -R8; DP3 R3.x, $TEXINPUT2, R4; DP3 R3.y, $TEXINPUT3, R4; DP3 R3.z, R9, R4; MOV R3.w, c[8].x; " // Not tested, only on texcoord 0 *if_texgen0_tsreflection " DP4 R3.x, R8, c[4]; DP4 R3.y, R8, c[5]; DP4 R3.z, R8, c[6]; MOV R3.w, c[8].x; DP3 R4.x, R9, c[4]; DP3 R4.y, R9, c[5]; DP3 R4.z, R9, c[6]; MOV R4.w, c[8].x; DP3 R3.w, -R3, R4; ADD R3.w, R3.w, R3.w; MUL R4, R4, R3.wwww; ADD R4, R3, R4; DP3 R3.x, $TEXINPUT2, R4; DP3 R3.y, $TEXINPUT3, R4; DP3 R3.z, R9, R4; MOV R3.w, c[8].x; " *if_texmatrix0 " DP4 @O_TEX0.x, R3, c[$TEXMATRIX0+0]; DP4 @O_TEX0.y, R3, c[$TEXMATRIX0+1]; DP4 @O_TEX0.z, R3, c[$TEXMATRIX0+2]; DP4 @O_TEX0.w, R3, c[$TEXMATRIX0+3]; " *ifnot_texmatrix0 " MOV @O_TEX0, R3; " } } // ---------------------------------------------------------------- *ifnot_texgen1_void { *if_texgen1_texcoord { *if_texmatrix1 " DP4 @O_TEX1.x, $TEXINPUT1, c[$TEXMATRIX1+0]; DP4 @O_TEX1.y, $TEXINPUT1, c[$TEXMATRIX1+1]; DP4 @O_TEX1.z, $TEXINPUT1, c[$TEXMATRIX1+2]; DP4 @O_TEX1.w, $TEXINPUT1, c[$TEXMATRIX1+3]; " *ifnot_texmatrix1 " MOV @O_TEX1, $TEXINPUT1; " } *ifnot_texgen1_texcoord { *if_texgen1_linear " DP4 R3.x, R8, c[$TEXPARAM1+0]; DP4 R3.y, R8, c[$TEXPARAM1+1]; DP4 R3.z, R8, c[$TEXPARAM1+2]; DP4 R3.w, R8, c[$TEXPARAM1+3]; " *if_texgen1_normalmap " MOV R3, R9; " *if_texgen1_reflection " DP4 R3.x, R8, c[4]; DP4 R3.y, R8, c[5]; DP4 R3.z, R8, c[6]; DP3 R4.x, R9, c[4]; DP3 R4.y, R9, c[5]; DP3 R4.z, R9, c[6]; DP3 R3.w, -R3, R4; ADD R3.w, R3.w, R3.w; MUL R4, R4, R3.wwww; ADD R3, R3, R4; MOV R3.w, c[8].x; " *if_texgen1_env " MOV R3, $TEXINPUT1; DP3 R3.x, R9, c[4]; DP3 R3.y, -R9, c[5]; MUL R3, R3, c[8].zzzz; ADD R3, R3, c[8].zzzz; " *if_texgen1_tslv " ADD R4, c[$TEXPARAM1+0], -R8; DP3 R3.x, $TEXINPUT2, R4; DP3 R3.y, $TEXINPUT3, R4; DP3 R3.z, R9, R4; MOV R3.w, c[8].x; " /* *if_texgen1_tsreflection " ADD R4, c[$TEXPARAM1+0], -R8; ADD R5, c[$TEXPARAM1+1], -R8; DP3 R3.w, R4, R4; RSQ R3.w, R3.w; MUL R4.xyz, R4, R3.w; DP3 R3.w, R5, R5; RSQ R3.w, R3.w; MUL R5.xyz, R5, R3.w; ADD R4, R4, R5; DP3 R3.x, $TEXINPUT2, R4; DP3 R3.y, $TEXINPUT3, R4; DP3 R3.z, R9, R4; MOV R3.w, c[8].x; " */ *if_texgen1_tsreflection " ADD R4, c[$TEXPARAM1+0], -R8; ADD R5, c[$TEXPARAM1+1], -R8; ADD R4, R4, R5; DP3 R3.w, R4, R4; RSQ R3.w, R3.w; MUL R4.xyz, R4, R3.w; DP3 R3.x, $TEXINPUT3, R4; DP3 R3.y, $TEXINPUT2, -R4; DP3 R3.z, R9, R4; MOV R4, c[8].yxxx; MUL R5, R3.zxyw, R4.yzxw; MAD R5, R3.yzxw, R4.zxyw, -R5; MUL R7, R3.zxyw, R5.yzxw; MAD R4, R3.yzxw, R5.zxyw, -R7; DP3 R3.w, R4, R4; RSQ R3.w, R3.w; MUL R4.xyz, R4, R3.w; DP3 R3.w, R5, R5; RSQ R3.w, R3.w; MUL R5.xyz, R5, R3.w; MOV @O_TEX2.x, R3.y; MOV @O_TEX2.y, R4.y; MOV @O_TEX2.z, R5.y; MOV @O_TEX2.w, c[8].x; MOV @O_TEX3.x, R3.z; MOV @O_TEX3.y, R4.z; MOV @O_TEX3.z, R5.z; MOV @O_TEX3.w, c[8].x; MOV R3.y, R4.x; MOV R3.z, R5.x; MOV R3.w, c[8].x; " /* DP3 R3.x, $TEXINPUT2, R4; DP3 R3.y, $TEXINPUT3, R4; DP3 R3.z, R9, R4; DP3 R3.w, R5, R5; RSQ R3.w, R3.w; MUL R5.xyz, R5, R3.w; ADD R4, R4, R5; */ // MOV R3, $TEXINPUT2; // MOV @O_TEX2, $TEXINPUT3; *if_texgen1_bumpcubeenv { *if_MWComp0 " MOV R10, $TEXINPUT2; MOV R11, $TEXINPUT3; " *ifnot_MWComp0 " DP3 R10.x, R0, $TEXINPUT2; DP3 R10.y, R1, $TEXINPUT2; DP3 R10.z, R2, $TEXINPUT2; DP3 R11.x, R0, $TEXINPUT3; DP3 R11.y, R1, $TEXINPUT3; DP3 R11.z, R2, $TEXINPUT3; " *doit " DP4 R3.x,c[$TEXPARAM1+0],R8; DP4 R3.y,c[$TEXPARAM1+1],R8; DP4 R3.z,c[$TEXPARAM1+2],R8; ADD R3, -R3.xyzz, c[$TEXPARAM1+7].xyzz; MOV R3.w, R3.x; MOV R4.w, R3.y; MOV R5.w, R3.z; DP3 R3.x,R9,c[$TEXPARAM1+0]; DP3 R3.y,R11,c[$TEXPARAM1+0]; DP3 R3.z,R10,c[$TEXPARAM1+0]; DP3 R4.x,R9,c[$TEXPARAM1+1]; DP3 R4.y,R11,c[$TEXPARAM1+1]; DP3 R4.z,R10,c[$TEXPARAM1+1]; DP3 R5.x,R9,c[$TEXPARAM1+2]; DP3 R5.y,R11,c[$TEXPARAM1+2]; DP3 R5.z,R10,c[$TEXPARAM1+2]; MUL R3.xyz, R3, c[$TEXPARAM1+3]; MUL R4.xyz, R4, c[$TEXPARAM1+3]; MUL R5.xyz, R5, c[$TEXPARAM1+3]; MOV @O_TEX2, R4; MOV @O_TEX3, R5; " } *if_texmatrix1 " DP4 @O_TEX1.x, R3, c[$TEXMATRIX1+0]; DP4 @O_TEX1.y, R3, c[$TEXMATRIX1+1]; DP4 @O_TEX1.z, R3, c[$TEXMATRIX1+2]; DP4 @O_TEX1.w, R3, c[$TEXMATRIX1+3]; " *ifnot_texmatrix1 " MOV @O_TEX1, R3; " } } // ---------------------------------------------------------------- *ifnot_texgen2_void { *if_texgen2_texcoord { *if_texmatrix2 " DP4 @O_TEX2.x, $TEXINPUT2, c[$TEXMATRIX2+0]; DP4 @O_TEX2.y, $TEXINPUT2, c[$TEXMATRIX2+1]; DP4 @O_TEX2.z, $TEXINPUT2, c[$TEXMATRIX2+2]; DP4 @O_TEX2.w, $TEXINPUT2, c[$TEXMATRIX2+3]; " *ifnot_texmatrix2 " MOV @O_TEX2, $TEXINPUT2; " } *ifnot_texgen2_texcoord { *if_texgen2_linear " DP4 R3.x, R8, c[$TEXPARAM2+0]; DP4 R3.y, R8, c[$TEXPARAM2+1]; DP4 R3.z, R8, c[$TEXPARAM2+2]; DP4 R3.w, R8, c[$TEXPARAM2+3]; " *if_texgen2_normalmap " MOV R3, R9; " *if_texgen2_reflection " DP4 R3.x, R8, c[4]; DP4 R3.y, R8, c[5]; DP4 R3.z, R8, c[6]; MOV R3.w, c[8].x; DP3 R4.x, R9, c[4]; DP3 R4.y, R9, c[5]; DP3 R4.z, R9, c[6]; MOV R4.w, c[8].x; DP3 R3.w, -R3, R4; ADD R3.w, R3.w, R3.w; MUL R4, R4, R3.wwww; ADD R3, R3, R4; MOV R3.w, c[8].x; " *if_texgen2_env " MOV R3, $TEXINPUT2; DP3 R3.x, R9, c[4]; DP3 R3.y, -R9, c[5]; MUL R3, R3, c[8].zzzz; ADD R3, R3, c[8].zzzz; " *if_texgen2_tslv " ADD R4, c[$TEXPARAM2+0], -R8; DP3 R3.x, $TEXINPUT2, R4; DP3 R3.y, $TEXINPUT3, R4; DP3 R3.z, R9, R4; MOV R3.w, c[8].x; " *if_texmatrix2 " DP4 @O_TEX2.x, R3, c[$TEXMATRIX2+0]; DP4 @O_TEX2.y, R3, c[$TEXMATRIX2+1]; DP4 @O_TEX2.z, R3, c[$TEXMATRIX2+2]; DP4 @O_TEX2.w, R3, c[$TEXMATRIX2+3]; " *ifnot_texmatrix2 " MOV @O_TEX2, R3; " } } // ---------------------------------------------------------------- *ifnot_texgen3_void { *if_texgen3_texcoord { *if_texmatrix3 " DP4 @O_TEX3.x, $TEXINPUT3, c[$TEXMATRIX3+0]; DP4 @O_TEX3.y, $TEXINPUT3, c[$TEXMATRIX3+1]; DP4 @O_TEX3.z, $TEXINPUT3, c[$TEXMATRIX3+2]; DP4 @O_TEX3.w, $TEXINPUT3, c[$TEXMATRIX3+3]; " *ifnot_texmatrix3 " MOV @O_TEX3, $TEXINPUT3; " } *ifnot_texgen3_texcoord { *if_texgen3_linear " DP4 R3.x, R8, c[$TEXPARAM3+0]; DP4 R3.y, R8, c[$TEXPARAM3+1]; DP4 R3.z, R8, c[$TEXPARAM3+2]; DP4 R3.w, R8, c[$TEXPARAM3+3]; " *if_texgen3_normalmap " MOV R3, R9; " *if_texgen3_reflection " DP4 R3.x, R8, c[4]; DP4 R3.y, R8, c[5]; DP4 R3.z, R8, c[6]; MOV R3.w, c[8].x; DP3 R4.x, R9, c[4]; DP3 R4.y, R9, c[5]; DP3 R4.z, R9, c[6]; MOV R4.w, c[8].x; DP3 R3.w, -R3, R4; ADD R3.w, R3.w, R3.w; MUL R4, R4, R3.wwww; ADD R3, R3, R4; MOV R3.w, c[8].x; " *if_texgen3_env " MOV R3, $TEXINPUT3; DP3 R3.x, R9, c[4]; DP3 R3.y, -R9, c[5]; MUL R3, R3, c[8].zzzz; ADD R3, R3, c[8].zzzz; " *if_texgen3_tslv " ADD R4, c[$TEXPARAM2+0], -R8; DP3 R3.x, $TEXINPUT2, R4; DP3 R3.y, $TEXINPUT3, R4; DP3 R3.z, R9, R4; MOV R3.w, c[8].x; " *if_texmatrix3 " DP4 @O_TEX3.x, R3, c[$TEXMATRIX3+0]; DP4 @O_TEX3.y, R3, c[$TEXMATRIX3+1]; DP4 @O_TEX3.z, R3, c[$TEXMATRIX3+2]; DP4 @O_TEX3.w, R3, c[$TEXMATRIX3+3]; " *ifnot_texmatrix3 " MOV @O_TEX3, R3; " } } *end " @END " }