Richard Boegli's CnC_Generals_Zero_Hour Fork WIP
This is documentation of Richard Boegil's Zero Hour Fork
 
Loading...
Searching...
No Matches
shd7bumpspec.cpp
Go to the documentation of this file.
1/*
2** Command & Conquer Generals Zero Hour(tm)
3** Copyright 2025 Electronic Arts Inc.
4**
5** This program is free software: you can redistribute it and/or modify
6** it under the terms of the GNU General Public License as published by
7** the Free Software Foundation, either version 3 of the License, or
8** (at your option) any later version.
9**
10** This program is distributed in the hope that it will be useful,
11** but WITHOUT ANY WARRANTY; without even the implied warranty of
12** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13** GNU General Public License for more details.
14**
15** You should have received a copy of the GNU General Public License
16** along with this program. If not, see <http://www.gnu.org/licenses/>.
17*/
18
19 /***********************************************************************************************
20 *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
21 ***********************************************************************************************
22 * *
23 * Project Name : WW3D *
24 * *
25 * $Archive:: /Commando/Code/ww3d2/shd7bumpspec.cpp $*
26 * *
27 * $Author:: Kenny_m
28 *
29 * $Modtime:: 6/06/02 11:18p $*
30 * *
31 * $Revision:: 3 $*
32 * *
33 * 06/06/02 KM added software vertex shader fallback check
34 *---------------------------------------------------------------------------------------------*
35 * Functions: *
36 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
37
38#include "dx8fvf.h"
39#include "dx8wrapper.h"
40#include "assetmgr.h"
41#include "rinfo.h"
42#include "camera.h"
43
44#include "shdbumpspec.h"
45#include "shd7bumpspec.h"
47#include "shdclassids.h"
48
49// shader code declarations
52
56
57
62{
64
66 (
67 Definition->Get_Texture_Name()
68 );
69
71 (
72 Definition->Get_Bump_Map_Name()
73 );
74
75 const Vector3& a=Definition->Get_Ambient();
76 Ambient.Set(a.X,a.Y,a.Z,1.0f);
77
78 const Vector3& d=Definition->Get_Diffuse();
79 Diffuse.Set(d.X,d.Y,d.Z,1.0f);
80
81 const Vector3& s=Definition->Get_Specular();
82 Specular.Set(s.X,s.Y,s.Z,1.0f);
83
84 const Vector2& db=Definition->Get_Diffuse_Bumpiness();
85 const Vector2& ds=Definition->Get_Specular_Bumpiness();
86 Bumpiness.Set(db.X,db.Y,ds.X,ds.Y);
87}
88
94
96{
97 // Create vertex shader
98 DWORD vertex_shader_declaration[]=
99 {
100 D3DVSD_STREAM(0),
101 (D3DVSD_REG(0, D3DVSDT_FLOAT3)), // vertex position
102 (D3DVSD_REG(1, D3DVSDT_FLOAT3)), // vertex normal
103 (D3DVSD_REG(2, D3DVSDT_D3DCOLOR)), // vertex color
104 (D3DVSD_REG(3, D3DVSDT_FLOAT2)), // vertex texture coords
105 (D3DVSD_REG(4, D3DVSDT_FLOAT3)), // vertex S basis
106 (D3DVSD_REG(5, D3DVSDT_FLOAT3)), // vertex T basis
107 (D3DVSD_REG(6, D3DVSDT_FLOAT3)), // vertex SxT basis
108 D3DVSD_END()
109 };
110
112 (
114 vertex_shader_declaration
115 );
116
118 (
120 vertex_shader_declaration
121 );
122
123}
124
126{
127 Pass_0_Vertex_Shader.Destroy();
128 Pass_1_Vertex_Shader.Destroy();
129}
130
131
132//**********************************************************************************************
134
138{
139 // vertex processing behavior
140 DX8Wrapper::Set_DX8_Render_State(D3DRS_SOFTWAREVERTEXPROCESSING,!Pass_0_Vertex_Shader.Is_Using_Hardware());
141
142 // fixed function uses pass through by default
143 DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_PASSTHRU);
144 DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_PASSTHRU);
145
146 if (pass==0)
147 {
148 // set vertex shader
150
151 // set texture stage settings
152 DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
153 DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3 );
154 DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
155
156 DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_ALPHAARG1, D3DTA_CURRENT);
157 DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
158
159 DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
160 DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
161 DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_COLORARG2, D3DTA_SPECULAR );
162
163 DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_ALPHAARG1, D3DTA_CURRENT);
164 DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_ALPHAOP, D3DTOP_ADDSMOOTH );
165 DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
166
167 DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_COLOROP, D3DTOP_DISABLE );
168 DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
169
170 DX8Wrapper::Set_DX8_Render_State(D3DRS_ALPHABLENDENABLE, TRUE);
171 DX8Wrapper::Set_DX8_Render_State(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
172 DX8Wrapper::Set_DX8_Render_State(D3DRS_DESTBLEND, D3DBLEND_ZERO);
173 }
174 else
175 {
176 // specular pass
177
178 // set vertex shader
180
181 const Matrix3D& cam=rinfo.Camera.Get_Transform();
182
183 // set constants
185 (
187 D3DXVECTOR4
188 (
189 cam.Get_X_Translation(),
190 cam.Get_Y_Translation(),
191 cam.Get_Z_Translation(),
192 1.0f
193 ),
194 1
195 );
196
197 // set texture stage settings
198 DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
199 DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3 );
200 DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
201
202 DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_ALPHAARG1, D3DTA_CURRENT);
203 DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
204 DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
205
206 DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_COLORARG1, D3DTA_CURRENT );
207 DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
208 DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_COLORARG2, D3DTA_SPECULAR );
209
210 DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
211 DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
212 DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
213
214 DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_COLOROP, D3DTOP_DISABLE );
215 DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
216
217 DX8Wrapper::Set_DX8_Render_State(D3DRS_ALPHABLENDENABLE, TRUE);
218 DX8Wrapper::Set_DX8_Render_State(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
219 DX8Wrapper::Set_DX8_Render_State(D3DRS_DESTBLEND, D3DBLEND_ONE);
220 }
221
222 // set constants
223 DX8Wrapper::Set_Vertex_Shader_Constant(CV_CONST, D3DXVECTOR4(0.0f, 1.0f, 0.5f, 2.0f), 1);
224
225 // calculate shader view projection matrix
226 Matrix4x4 view_matrix;
227 DX8Wrapper::Get_Transform(D3DTS_VIEW, view_matrix);
228
229 Matrix4x4 proj_matrix;
230 DX8Wrapper::Get_Transform(D3DTS_PROJECTION, proj_matrix);
231
232 Matrix4x4::Multiply(proj_matrix, view_matrix, &View_Projection_Matrix);
233}
234
235//**********************************************************************************************
237
240{
243
244 // set vertex shader constants
245 Matrix4x4 world;
246 DX8Wrapper::Get_Transform(D3DTS_WORLD, world);
247
248 Matrix4x4 world_view_proj_matrix;
249
250 Matrix4x4::Multiply(View_Projection_Matrix,world,&world_view_proj_matrix);
251
254
256 (
257 rinfo,
258 Ambient,
259 Diffuse,
261 );
262
264}
265
267{
268 return 1;
269}
270
271unsigned Shd7BumpSpecClass::Get_Vertex_Size(unsigned stream) const
272{
273 return sizeof(VertexFormatXYZNDUV1TG3);
274}
275
277(
278 unsigned stream,
279 void* dest_buffer,
280 const VertexStreamStruct& vss,
281 unsigned vertex_count
282)
283{
285
286 for (unsigned i=0; i<vertex_count; ++i)
287 {
288 if (vss.Locations)
289 {
290 verts[i].x=vss.Locations[i][0];
291 verts[i].y=vss.Locations[i][1];
292 verts[i].z=vss.Locations[i][2];
293 }
294 else
295 {
296 verts[i].x=0.0f;
297 verts[i].y=0.0f;
298 verts[i].z=0.0f;
299 }
300
301 if (vss.DiffuseInt)
302 {
303 verts[i].diffuse=vss.DiffuseInt[i];
304 }
305 else
306 {
307 verts[i].diffuse=0xffffffff;
308 }
309
310 if (vss.Normals)
311 {
312 verts[i].nx=vss.Normals[i][0];
313 verts[i].ny=vss.Normals[i][1];
314 verts[i].nz=vss.Normals[i][2];
315 }
316 else
317 {
318 verts[i].nx=0.0f;
319 verts[i].ny=0.0f;
320 verts[i].nz=0.0f;
321 }
322
323 if (vss.UV[0])
324 {
325 verts[i].u1=vss.UV[0][i].U;
326 verts[i].v1=vss.UV[0][i].V;
327 }
328 else
329 {
330 verts[i].u1=0.0f;
331 verts[i].v1=0.0f;
332 }
333
334 if (vss.S)
335 {
336 verts[i].Sx=vss.S[i].X;
337 verts[i].Sy=vss.S[i].Y;
338 verts[i].Sz=vss.S[i].Z;
339 }
340 else
341 {
342 verts[i].Sx=0.0f;
343 verts[i].Sy=0.0f;
344 verts[i].Sz=0.0f;
345 }
346
347 if (vss.T)
348 {
349 verts[i].Tx=vss.T[i].X;
350 verts[i].Ty=vss.T[i].Y;
351 verts[i].Tz=vss.T[i].Z;
352 }
353 else
354 {
355 verts[i].Tx=0.0f;
356 verts[i].Ty=0.0f;
357 verts[i].Tz=0.0f;
358 }
359
360 if (vss.SxT)
361 {
362 verts[i].SxTx=vss.SxT[i].X;
363 verts[i].SxTy=vss.SxT[i].Y;
364 verts[i].SxTz=vss.SxT[i].Z;
365 }
366 else
367 {
368 verts[i].SxTx=0.0f;
369 verts[i].SxTy=0.0f;
370 verts[i].SxTz=0.0f;
371 }
372 }
373}
374
#define NULL
Definition BaseType.h:92
#define TRUE
Definition BaseType.h:109
unsigned long DWORD
Definition bittype.h:57
static void Set_Vertex_Shader_Constant(int reg, const void *data, int count)
Definition dx8wrapper.h:739
static void Set_Texture(unsigned stage, TextureBaseClass *texture)
static void Set_DX8_Texture_Stage_State(unsigned stage, D3DTEXTURESTAGESTATETYPE state, unsigned value)
Definition dx8wrapper.h:899
static void Set_Vertex_Shader(DWORD vertex_shader)
Definition dx8wrapper.h:719
static void Get_Transform(D3DTRANSFORMSTATETYPE transform, Matrix4x4 &m)
static void Set_DX8_Render_State(D3DRENDERSTATETYPE state, unsigned value)
Definition dx8wrapper.h:874
WWINLINE float Get_X_Translation(void) const
Definition matrix3d.h:224
WWINLINE float Get_Z_Translation(void) const
Definition matrix3d.h:226
WWINLINE float Get_Y_Translation(void) const
Definition matrix3d.h:225
WWINLINE friend Matrix4x4 Multiply(const Matrix4x4 &a, const Matrix4x4 &b)
Definition matrix4.h:743
CameraClass & Camera
Definition rinfo.h:100
const Matrix3D & Get_Transform(void) const
Definition rendobj.h:617
virtual void Copy_Vertex_Stream(unsigned stream, void *dest_buffer, const VertexStreamStruct &vss, unsigned vertex_count)
static ShdHWVertexShader Pass_1_Vertex_Shader
static void Shutdown()
Shd7BumpSpecClass(const ShdDefClass *def)
virtual void Apply_Shared(int cur_pass, RenderInfoClass &rinfo)
Apply shared states for 2 pass DX7 bump specular with gloss map.
TextureClass * Texture
virtual unsigned Get_Vertex_Size(unsigned stream) const
virtual unsigned Get_Vertex_Stream_Count() const
static Matrix4x4 View_Projection_Matrix
static ShdHWVertexShader Pass_0_Vertex_Shader
virtual ~Shd7BumpSpecClass()
virtual void Apply_Instance(int cur_pass, RenderInfoClass &rinfo)
Apply per instance states for 2 pass DX7 bump specular with gloss map.
static void Init()
TextureClass * NormalMap
static void Light(RenderInfoClass &rinfo, Vector4 &ambient, Vector4 &diffuse, Vector4 &specular)
Apply generic lighting.
ShdInterfaceClass(const ShdDefClass *def, int class_id)
Constructor.
const ShdDefClass * Definition
float V
Definition vector2.h:80
float Y
Definition vector2.h:79
float X
Definition vector2.h:74
float U
Definition vector2.h:75
float X
Definition vector3.h:90
float Z
Definition vector3.h:92
float Y
Definition vector3.h:91
virtual TextureClass * Get_Texture(const char *filename, MipCountType mip_level_count=MIP_LEVELS_ALL, WW3DFormat texture_format=WW3D_FORMAT_UNKNOWN, bool allow_compression=true, TextureBaseClass::TexAssetType type=TextureBaseClass::TEX_REGULAR, bool allow_reduction=true)
static WW3DAssetManager * Get_Instance(void)
Definition assetmgr.h:205
#define REF_PTR_RELEASE(x)
Definition refcount.h:80
#define CV_WORLD_VIEW_PROJECTION
#define CV_WORLD
#define CV_EYE_WORLD
#define CV_BUMPINESS
DWORD shd7bumpspecpass0_vsh_code[]
DWORD shd7bumpspecpass1_vsh_code[]
@ SHDDEF_CLASSID_BUMPSPEC
Definition shdclassids.h:51
#define CV_CONST
const Vector3 * Normals
const Vector2 * UV[MAX_TEXTURE_STAGES]
const Vector3 * S
const Vector3 * SxT
const Vector3 * T
const unsigned * DiffuseInt
const Vector3 * Locations