Commit MetaInfo

Revisione20b4b8a0ac2db10b27cf6f60c68bdac4e94edbc (tree)
Time2019-11-05 09:28:42
Author <jarmonik@c0f5...>

Log Message

- Clened up a mesh buffer handling, implemented a proper templates, optimized mesh add/insert mesh operations.
- Fixed a few material manager bugs.

Change Summary

Incremental Difference

diff -r 1f4979392798 -r e20b4b8a0ac2 Config/GC/Moon.atms.cfg
--- a/Config/GC/Moon.atms.cfg Wed Oct 23 21:44:24 2019 +0000
+++ b/Config/GC/Moon.atms.cfg Tue Nov 05 00:28:42 2019 +0000
@@ -5,8 +5,8 @@
55 MWaveDep = 1
66 ScaleHeight = 8
77 DepthClamp = 0.0042
8-Exposure = 1.3055
9-TGamma = 0.5292
8+Exposure = 1.004
9+TGamma = 0.606
1010 OutScatter = 0.592
1111 InScatter = 1
1212 RayleighPhase = 0.3395
diff -r 1f4979392798 -r e20b4b8a0ac2 D3D9Client.cfg
--- a/D3D9Client.cfg Wed Oct 23 21:44:24 2019 +0000
+++ b/D3D9Client.cfg Tue Nov 05 00:28:42 2019 +0000
@@ -16,7 +16,7 @@
1616 BumpMapAmplitude = 1
1717 PlanetGlow = 0.4
1818 EnvMapSize = 512
19-EnvMapMode = 1
19+EnvMapMode = 2
2020 EnvMapFaces = 1
2121 ShadowMapMode = 3
2222 ShadowMapFilter = 2
@@ -31,7 +31,7 @@
3131 StereoConvergence = 0.2
3232 DebugLvl = 1
3333 VCNearPlane = 0.1
34-LightCongiguration = 2
34+LightConfiguration = 2
3535 DisableDrvMgm = 0
3636 NVPerfHUD = 0
3737 DebugLineFontSize = 18
@@ -39,13 +39,15 @@
3939 LODBias = 0.6
4040 MeshRes = 1
4141 MicroMode = 1
42-MicroFilter = 3
42+MicroFilter = 5
4343 BlendMode = 1
4444 MicroBias = 3
45-PostProcess = 1
45+CloudMicro = 1
46+PostProcess = 0
4647 ShaderDebug = 0
4748 PresentLocation = 1
4849 PlanetTileLoadFlags = 3
4950 LabelDisplayFlags = 3
51+OrbitalShadowMult = 0.85
5052 SolCfg = Sol
5153 DebugLineFont = Fixed
diff -r 1f4979392798 -r e20b4b8a0ac2 Orbitersdk/D3D9Client/D3D9Client.cpp
--- a/Orbitersdk/D3D9Client/D3D9Client.cpp Wed Oct 23 21:44:24 2019 +0000
+++ b/Orbitersdk/D3D9Client/D3D9Client.cpp Tue Nov 05 00:28:42 2019 +0000
@@ -1521,6 +1521,7 @@
15211521 DebugControls::SelectMesh(pick.pMesh);
15221522 DebugControls::SelectGroup(pick.group);
15231523 DebugControls::SetGroupHighlight(true);
1524+ DebugControls::SetPickPos(pick.pos);
15241525 }
15251526 }
15261527 }
diff -r 1f4979392798 -r e20b4b8a0ac2 Orbitersdk/D3D9Client/D3D9Util.cpp
--- a/Orbitersdk/D3D9Client/D3D9Util.cpp Wed Oct 23 21:44:24 2019 +0000
+++ b/Orbitersdk/D3D9Client/D3D9Util.cpp Tue Nov 05 00:28:42 2019 +0000
@@ -142,6 +142,19 @@
142142 pOut->ModFlags = 0;
143143 }
144144
145+void CreateDefaultMat(D3D9MatExt *pOut)
146+{
147+ pOut->Ambient = D3DXVECTOR3(0, 0, 0);
148+ pOut->Diffuse = D3DXVECTOR4(1, 1, 1, 1);
149+ pOut->Emissive = D3DXVECTOR3(0, 0, 0);
150+ pOut->Specular = D3DXVECTOR4(0.2, 0.2, 0.2, 50.0);
151+ pOut->Reflect = D3DXVECTOR3(0, 0, 0);
152+ pOut->Fresnel = D3DXVECTOR3(1, 0, 1024.0f);
153+ pOut->Emission2 = D3DXVECTOR3(1, 1, 1);
154+ pOut->Roughness = 0.0f;
155+ pOut->ModFlags = 0;
156+}
157+
145158 void D3D9TuneInit(D3D9Tune *pTune)
146159 {
147160 pTune->Albedo = D3DXCOLOR(1, 1, 1, 1);
diff -r 1f4979392798 -r e20b4b8a0ac2 Orbitersdk/D3D9Client/D3D9Util.h
--- a/Orbitersdk/D3D9Client/D3D9Util.h Wed Oct 23 21:44:24 2019 +0000
+++ b/Orbitersdk/D3D9Client/D3D9Util.h Tue Nov 05 00:28:42 2019 +0000
@@ -273,8 +273,8 @@
273273 class vObject *vObj; ///< Visual handle
274274 float dist; ///< Distance to a pick point
275275 int group; ///< Mesh group that was picked
276- D3DXVECTOR3 normal; ///< Normal vector
277- D3DXVECTOR3 pos; ///< Position from camera
276+ D3DXVECTOR3 normal; ///< Normal vector in local vessel coordinates
277+ D3DXVECTOR3 pos; ///< Position in local vessel coordinates
278278 int idx; ///< Index that was picked
279279 float u, v; ///< Barycentric coords
280280 } D3D9Pick;
@@ -437,6 +437,7 @@
437437
438438 void CreateMatExt(const D3DMATERIAL9 *pIn, D3D9MatExt *pOut);
439439 void UpdateMatExt(const D3DMATERIAL9 *pIn, D3D9MatExt *pOut);
440+void CreateDefaultMat(D3D9MatExt *pOut);
440441 void GetMatExt(const D3D9MatExt *pIn, D3DMATERIAL9 *pOut);
441442 bool CopyBuffer(LPDIRECT3DRESOURCE9 _pDst, LPDIRECT3DRESOURCE9 _pSrc);
442443 void D3D9TuneInit(D3D9Tune *);
diff -r 1f4979392798 -r e20b4b8a0ac2 Orbitersdk/D3D9Client/DebugControls.cpp
--- a/Orbitersdk/D3D9Client/DebugControls.cpp Wed Oct 23 21:44:24 2019 +0000
+++ b/Orbitersdk/D3D9Client/DebugControls.cpp Tue Nov 05 00:28:42 2019 +0000
@@ -40,6 +40,7 @@
4040 HWND hDataWnd = NULL;
4141 vObject *vObj = NULL;
4242 std::string buffer("");
43+D3DXVECTOR3 PickLocation;
4344
4445 HWND hTipRed, hTipGrn, hTipBlu, hTipAlp;
4546
@@ -145,6 +146,7 @@
145146 camMode = 0;
146147 dspMode = 0;
147148 SelColor = 0;
149+ PickLocation = D3DXVECTOR3(0,0,0);
148150
149151 cpr = cpg = cpb = cpa = 0.0f;
150152
@@ -1027,6 +1029,11 @@
10271029 return sMesh;
10281030 }
10291031
1032+void SetPickPos(D3DXVECTOR3 pos)
1033+{
1034+ PickLocation = pos;
1035+}
1036+
10301037 // =============================================================================================
10311038 //
10321039 void SelectGroup(DWORD idx)
@@ -1391,6 +1398,9 @@
13911398 void Refresh()
13921399 {
13931400 if (hDataWnd == NULL) return;
1401+
1402+ Append("LocalPos = [%f, %f, %f]", PickLocation.x, PickLocation.y, PickLocation.z);
1403+
13941404 SetWindowTextA(GetDlgItem(hDataWnd, IDC_DBG_DATAVIEW), buffer.c_str());
13951405 buffer.clear();
13961406 }
diff -r 1f4979392798 -r e20b4b8a0ac2 Orbitersdk/D3D9Client/DebugControls.h
--- a/Orbitersdk/D3D9Client/DebugControls.h Wed Oct 23 21:44:24 2019 +0000
+++ b/Orbitersdk/D3D9Client/DebugControls.h Tue Nov 05 00:28:42 2019 +0000
@@ -104,6 +104,7 @@
104104 void SetVisual(vObject *vo);
105105 void RemoveVisual(vObject *vo);
106106 vObject * GetVisual();
107+ void SetPickPos(D3DXVECTOR3 pos);
107108
108109 void SetupMeshGroups();
109110 void UpdateVisual();
diff -r 1f4979392798 -r e20b4b8a0ac2 Orbitersdk/D3D9Client/MaterialMgr.cpp
--- a/Orbitersdk/D3D9Client/MaterialMgr.cpp Wed Oct 23 21:44:24 2019 +0000
+++ b/Orbitersdk/D3D9Client/MaterialMgr.cpp Tue Nov 05 00:28:42 2019 +0000
@@ -365,6 +365,8 @@
365365 return false;
366366 }
367367
368+ fprintf(file.pFile, "CONFIG_VERSION 2\n");
369+
368370 for (DWORD k=0;k<nRec;k++) pRecord[k].bSaved = false;
369371
370372 for (DWORD k=0;k<nRec;k++) {
@@ -397,7 +399,7 @@
397399 if (flags&D3D9MATEX_REFLECT) fprintf(file.pFile,"REFLECT %f %f %f\n", pM->Reflect.x, pM->Reflect.y, pM->Reflect.z);
398400 if (flags&D3D9MATEX_FRESNEL) fprintf(file.pFile,"FRESNEL %f %f %f\n", pM->Fresnel.x, pM->Fresnel.z, pM->Fresnel.y);
399401 if (flags&D3D9MATEX_EMISSION2) fprintf(file.pFile, "EMISSION2 %f %f %f\n", pM->Emission2.x, pM->Emission2.y, pM->Emission2.z);
400- if (flags&D3D9MATEX_ROUGHNESS) fprintf(file.pFile, "ROUGHNESS %f\n", pM->Roughness);
402+ if (flags&D3D9MATEX_ROUGHNESS) fprintf(file.pFile, "ROUGHNESS %f\n", pM->Roughness);
401403 }
402404 }
403405 return true;
diff -r 1f4979392798 -r e20b4b8a0ac2 Orbitersdk/D3D9Client/Mesh.cpp
--- a/Orbitersdk/D3D9Client/Mesh.cpp Wed Oct 23 21:44:24 2019 +0000
+++ b/Orbitersdk/D3D9Client/Mesh.cpp Tue Nov 05 00:28:42 2019 +0000
@@ -31,21 +31,136 @@
3131 return 0;
3232 }
3333
34-// ===========================================================================================
34+
35+
36+// ======================================================================================
37+// Buffer Object Implementation
38+// ======================================================================================
39+//
40+
41+MeshBuffer::MeshBuffer(DWORD _nVtx, DWORD _nFace, const class D3D9Mesh *_pRoot)
42+{
43+ nVtx = _nVtx;
44+ nIdx = _nFace * 3;
45+
46+ pVB = NULL;
47+ pIB = NULL;
48+ pGB = NULL;
49+
50+ pVBSys = new NMVERTEX[nVtx];
51+ pIBSys = new WORD[nIdx];
52+ pGBSys = new D3DXVECTOR4[nVtx];
53+
54+ pRoot = _pRoot;
55+ mapMode = MAPMODE_STATIC;
56+ bMustRemap = true;
57+}
58+
59+
60+MeshBuffer::MeshBuffer(MeshBuffer *pSrc, const class D3D9Mesh *_pRoot)
61+{
62+ nVtx = pSrc->nVtx;
63+ nIdx = pSrc->nIdx;
64+
65+ pVB = NULL;
66+ pIB = NULL;
67+ pGB = NULL;
68+
69+ pVBSys = new NMVERTEX[nVtx];
70+ pIBSys = new WORD[nIdx];
71+ pGBSys = new D3DXVECTOR4[nVtx];
72+
73+ memcpy(pVBSys, pSrc->pVBSys, sizeof(NMVERTEX) * nVtx);
74+ memcpy(pGBSys, pSrc->pGBSys, sizeof(D3DXVECTOR4) * nVtx);
75+ memcpy(pIBSys, pSrc->pIBSys, sizeof(WORD) * nIdx);
76+
77+ pRoot = _pRoot;
78+ mapMode = MAPMODE_STATIC;
79+ bMustRemap = true;
80+}
81+
82+
83+MeshBuffer::~MeshBuffer()
84+{
85+ SAFE_DELETEA(pGBSys);
86+ SAFE_DELETEA(pIBSys);
87+ SAFE_DELETEA(pVBSys);
88+ SAFE_RELEASE(pIB);
89+ SAFE_RELEASE(pVB);
90+ SAFE_RELEASE(pGB);
91+}
92+
93+void MeshBuffer::MustRemap(DWORD mode)
94+{
95+ if (mode == MAPMODE_CURRENT) mode = mapMode;
96+
97+ if (mode != mapMode) {
98+ SAFE_RELEASE(pIB);
99+ SAFE_RELEASE(pVB);
100+ SAFE_RELEASE(pGB);
101+ mapMode = mode;
102+ }
103+
104+ bMustRemap = true;
105+}
106+
107+void MeshBuffer::Map(LPDIRECT3DDEVICE9 pDev)
108+{
109+
110+ if (!bMustRemap) return;
111+
112+ bMustRemap = false;
113+
114+ DWORD Usage = 0;
115+ DWORD Lock = 0;
116+
117+ if (mapMode == MAPMODE_DYNAMIC) Usage = D3DUSAGE_DYNAMIC, Lock = D3DLOCK_DISCARD;
118+
119+ if (!pVB) {
120+ HR(pDev->CreateVertexBuffer(nVtx * sizeof(NMVERTEX), Usage, 0, D3DPOOL_DEFAULT, &pVB, NULL));
121+ }
122+ if (!pGB) {
123+ HR(pDev->CreateVertexBuffer(nVtx * sizeof(D3DXVECTOR4), Usage, 0, D3DPOOL_DEFAULT, &pGB, NULL));
124+ }
125+ if (!pIB) {
126+ HR(pDev->CreateIndexBuffer(nIdx * sizeof(WORD), Usage, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &pIB, NULL));
127+ }
128+
129+ LPVOID pTgt;
130+
131+ HR(pVB->Lock(0, 0, (LPVOID*)&pTgt, Lock));
132+ memcpy2(pTgt, pVBSys, nVtx * sizeof(NMVERTEX));
133+ HR(pVB->Unlock());
134+
135+ HR(pGB->Lock(0, 0, (LPVOID*)&pTgt, Lock));
136+ memcpy2(pTgt, pGBSys, nVtx * sizeof(D3DXVECTOR4));
137+ HR(pGB->Unlock());
138+
139+ HR(pIB->Lock(0, 0, (LPVOID*)&pTgt, Lock));
140+ memcpy2(pTgt, pIBSys, nIdx * sizeof(WORD));
141+ HR(pIB->Unlock());
142+}
143+
144+
145+
146+
147+
148+
149+
150+
151+// ======================================================================================
152+// Mesh Implementation
153+// ======================================================================================
35154 //
36155 void D3D9Mesh::Null()
37156 {
38- pVB = NULL;
39- pIB = NULL;
40- pGB = NULL;
41- pGBSys = NULL;
42- pIBSys = NULL;
43157 nGrp = 0;
44158 Grp = NULL;
45159 nTex = 0;
46160 Tex = NULL;
47161 pTune = NULL;
48162 nMtrl = 0;
163+ pBuf = NULL;
49164 Mtrl = NULL;
50165 pGrpTF = NULL;
51166 sunLight = NULL;
@@ -53,7 +168,8 @@
53168 MaxFace = 0;
54169 MaxVert = 0;
55170 vClass = 0;
56- bDynamic = false;
171+
172+ bIsTemplate = false;
57173 bGlobalTF = false;
58174 bBSRecompute = true;
59175 bBSRecomputeAll = true;
@@ -80,6 +196,9 @@
80196 LoadMeshFromHandle(hMesh);
81197 oapiDeleteMesh(hMesh);
82198 }
199+
200+ MeshCatalog->Add(this);
201+ pBuf->Map(pDev);
83202 }
84203
85204 // ===========================================================================================
@@ -88,6 +207,9 @@
88207 {
89208 Null();
90209 LoadMeshFromHandle(hMesh, reorig, scale);
210+ bIsTemplate = asTemplate;
211+ MeshCatalog->Add(this);
212+ pBuf->Map(pDev);
91213 }
92214
93215
@@ -107,9 +229,6 @@
107229 Grp[i].MtrlIdx = SPEC_DEFAULT;
108230 }
109231
110- HR(pDev->CreateVertexBuffer(MaxVert*sizeof(NMVERTEX), 0, 0, D3DPOOL_DEFAULT, &pVB, NULL));
111- HR(pDev->CreateIndexBuffer(MaxFace*sizeof(WORD)*3, 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &pIB, NULL));
112-
113232 nMtrl = 0;
114233 nTex = nGrp+1;
115234 Tex = new LPD3D9CLIENTSURFACE[nTex];
@@ -118,6 +237,8 @@
118237
119238 ProcessInherit();
120239
240+ pBuf = new MeshBuffer(MaxVert, MaxFace, this);
241+
121242 for (DWORD i=0;i<nGrp;i++) CopyVertices(&Grp[i], hGroup[i]);
122243
123244 pGrpTF = new D3DXMATRIX[nGrp];
@@ -127,8 +248,9 @@
127248 MeshCatalog->Add(this);
128249
129250 UpdateBoundingBox();
130- UpdateGeometryBuffer();
131251 CheckMeshStatus();
252+
253+ pBuf->Map(pDev);
132254 }
133255
134256
@@ -151,8 +273,7 @@
151273
152274 SetGroupRec(0, pGroup);
153275
154- HR(pDev->CreateVertexBuffer(MaxVert*sizeof(NMVERTEX), 0, 0, D3DPOOL_DEFAULT, &pVB, NULL));
155- HR(pDev->CreateIndexBuffer(MaxFace*sizeof(WORD)*3, 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &pIB, NULL));
276+ pBuf = new MeshBuffer(MaxVert, MaxFace, this);
156277
157278 SetMaterial((const D3DMATERIAL9*)pMat, 0, false);
158279 CopyVertices(&Grp[0], pGroup);
@@ -162,93 +283,62 @@
162283 MeshCatalog->Add(this);
163284
164285 UpdateBoundingBox();
165- UpdateGeometryBuffer();
166286 CheckMeshStatus();
287+
288+ pBuf->Map(pDev);
167289 }
168290
169291
170292 // ===========================================================================================
293+// Create new Instance from a template mesh
171294 //
172-void D3D9Mesh::Copy(const D3D9Mesh &mesh)
295+D3D9Mesh::D3D9Mesh(MESHHANDLE hMesh, const D3D9Mesh &hTemp)
173296 {
174297 Null();
175298
176- bModulateMatAlpha = mesh.bModulateMatAlpha;
177- strcpy_s(name, 128, mesh.name);
178-
179- nGrp = mesh.nGrp;
180- Grp = new GROUPREC[nGrp];
181- pGrpTF = new D3DXMATRIX[nGrp];
182-
183- MaxFace = mesh.MaxFace;
184- MaxVert = mesh.MaxVert;
185-
186- memcpy2(Grp, mesh.Grp, sizeof(GROUPREC)*nGrp);
187-
188- HR(pDev->CreateVertexBuffer(MaxVert*sizeof(NMVERTEX), 0, 0, D3DPOOL_DEFAULT, &pVB, NULL));
189- HR(pDev->CreateIndexBuffer(MaxFace*sizeof(WORD)*3, 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &pIB, NULL));
190-
191- // ----------------------------------------------------------------
192-
193- LPVOID pVSrc, pVTgt;
194- LPVOID pISrc, pITgt;
195-
196- HR(mesh.pIB->Lock(0, 0, &pISrc, 0));
197- HR(pIB->Lock(0, 0, &pITgt, 0));
198- memcpy2(pITgt, pISrc, MaxFace*6);
199- HR(mesh.pIB->Unlock());
200- HR(pIB->Unlock());
299+ // Confirm the source is global template
300+ assert(hTemp.bIsTemplate == true);
301+
302+ nGrp = oapiMeshGroupCount(hMesh); assert(nGrp == hTemp.nGrp);
303+
304+ if (nGrp == 0) return;
305+
306+ strcpy_s(name, 128, hTemp.name);
307+
308+ // Use Template's Vertex Data directly, no need for a local copy unless locally modified.
309+ pBuf = hTemp.pBuf;
310+
311+ MaxVert = hTemp.MaxVert;
312+ MaxFace = hTemp.MaxFace;
201313
202-
203- HR(mesh.pVB->Lock(0, 0, (LPVOID*)&pVSrc, 0));
204- HR(pVB->Lock(0, 0, (LPVOID*)&pVTgt, 0));
205- memcpy2(pVTgt, pVSrc, MaxVert*sizeof(NMVERTEX));
206- HR(mesh.pVB->Unlock());
207- HR(pVB->Unlock());
208-
209- // ----------------------------------------------------------------
210-
211- if (mesh.pGB) {
212-
213- // Create Geometry Buffers
214- HR(pDev->CreateVertexBuffer(MaxVert*sizeof(D3DXVECTOR4), 0, 0, D3DPOOL_DEFAULT, &pGB, NULL));
215-
216- HR(mesh.pGB->Lock(0, 0, (LPVOID*)&pVSrc, 0));
217- HR(pGB->Lock(0, 0, (LPVOID*)&pVTgt, 0));
218- memcpy2(pVTgt, pVSrc, MaxVert*sizeof(D3DXVECTOR4));
219- HR(mesh.pGB->Unlock());
220- HR(pGB->Unlock());
221-
222- if (mesh.pGBSys) {
223- pGBSys = new D3DXVECTOR3[MaxVert];
224- memcpy2(pGBSys, mesh.pGBSys, MaxVert * sizeof(D3DXVECTOR3));
225- }
226-
227- if (mesh.pIBSys) {
228- pIBSys = new WORD[MaxFace * 3];
229- memcpy2(pIBSys, mesh.pIBSys, MaxFace * 3 * sizeof(WORD));
230- }
231- }
232-
233- // ----------------------------------------------------------------
234-
235- nTex = mesh.nTex;
314+ // Clone group records from a tremplate
315+ Grp = new GROUPREC[nGrp];
316+ memcpy(Grp, hTemp.Grp, sizeof(GROUPREC)*nGrp);
317+
318+ if (MaxVert == 0 || MaxFace == 0) return;
319+
320+ // -----------------------------------------------------------------------
321+ nTex = oapiMeshTextureCount(hMesh) + 1; assert(nTex == hTemp.nTex);
236322 Tex = new LPD3D9CLIENTSURFACE[nTex];
237-
238- for (DWORD i=0;i<nTex;i++) Tex[i] = mesh.Tex[i];
239-
240- nMtrl = mesh.nMtrl;
323+ Tex[0] = 0; // 'no texture'
324+ for (DWORD i = 1; i<nTex; i++) Tex[i] = SURFACE(oapiGetTextureHandle(hMesh, i));
325+
326+ // -----------------------------------------------------------------------
327+ nMtrl = oapiMeshMaterialCount(hMesh); assert(nMtrl == hTemp.nMtrl);
241328 if (nMtrl) Mtrl = new D3D9MatExt[nMtrl];
242- memcpy2 (Mtrl, mesh.Mtrl, nMtrl*sizeof(D3D9MatExt));
243-
244- mTransform = mesh.mTransform;
245- mTransformInv = mesh.mTransformInv;
246- bGlobalTF = mesh.bGlobalTF;
329+ for (DWORD i = 0; i<nMtrl; i++) SetMaterial((const D3DMATERIAL9*)oapiMeshMaterial(hMesh, i), i, false);
330+
331+ pGrpTF = new D3DXMATRIX[nGrp];
332+
333+ D3DXMatrixIdentity(&mTransform);
334+ D3DXMatrixIdentity(&mTransformInv);
247335
248336 MeshCatalog->Add(this);
249337
250338 UpdateBoundingBox();
251339 CheckMeshStatus();
340+
341+ // No need to "pBuf->Map(pDev)" here, source template is already mapped
252342 }
253343
254344
@@ -257,7 +347,6 @@
257347 D3D9Mesh::~D3D9Mesh()
258348 {
259349 _TRACE;
260- if (!pVB) return;
261350
262351 if (MeshCatalog->Remove(this)) LogAlw("Mesh 0x%X Removed from catalog",this);
263352 else LogErr("Mesh 0x%X wasn't in meshcatalog",this);
@@ -278,22 +367,70 @@
278367 SAFE_DELETEA(Mtrl);
279368 SAFE_DELETEA(pGrpTF);
280369 SAFE_DELETEA(pTune);
281- SAFE_RELEASE(pIB);
282- SAFE_RELEASE(pVB);
283- SAFE_RELEASE(pGB);
284-
285- SAFE_DELETEA(pGBSys);
286- SAFE_DELETEA(pIBSys);
370+
371+ if (pBuf) if (pBuf->IsLocalTo(this)) delete pBuf;
287372 }
288373
289374
290375 // ===========================================================================================
376+// Reload a mesh file in response to VESSEL::MeshModified() call
291377 //
378+
292379 void D3D9Mesh::ReLoadMeshFromHandle(MESHHANDLE hMesh)
293380 {
294- Release();
295- Null();
296- LoadMeshFromHandle(hMesh);
381+
382+ // Relese buffers, Tex, Mtrl and Grp counts may have changed.
383+ SAFE_DELETEA(Tex);
384+ SAFE_DELETEA(Mtrl);
385+ SAFE_DELETEA(pGrpTF);
386+ SAFE_DELETEA(Grp);
387+
388+ nGrp = oapiMeshGroupCount(hMesh);
389+
390+ if (nGrp == 0) return;
391+
392+ Grp = new GROUPREC[nGrp];
393+ memset2(Grp, 0, sizeof(GROUPREC) * nGrp);
394+
395+ MaxFace = 0; // Incremented in SetGroupRec()
396+ MaxVert = 0;
397+
398+ for (DWORD i = 0; i<nGrp; i++) SetGroupRec(i, oapiMeshGroupEx(hMesh, i));
399+
400+ if (MaxVert == 0 || MaxFace == 0) {
401+ if (pBuf) if (pBuf->IsLocalTo(this)) {
402+ delete pBuf; pBuf = NULL;
403+ }
404+ return;
405+ }
406+
407+ // If this is an instance, Create a local vertex buffers...
408+ if (pBuf->IsLocalTo(this) == false) pBuf = new MeshBuffer(MaxVert, MaxFace, this);
409+
410+ // -----------------------------------------------------------------------
411+ nTex = oapiMeshTextureCount(hMesh) + 1;
412+ Tex = new LPD3D9CLIENTSURFACE[nTex];
413+ Tex[0] = 0; // 'no texture'
414+ for (DWORD i = 1; i<nTex; i++) Tex[i] = SURFACE(oapiGetTextureHandle(hMesh, i));
415+ // -----------------------------------------------------------------------
416+ nMtrl = oapiMeshMaterialCount(hMesh);
417+ if (nMtrl) Mtrl = new D3D9MatExt[nMtrl];
418+ for (DWORD i = 0; i<nMtrl; i++) SetMaterial((const D3DMATERIAL9*)oapiMeshMaterial(hMesh, i), i, false);
419+ // -----------------------------------------------------------------------
420+
421+ ProcessInherit();
422+
423+ for (DWORD i = 0; i<nGrp; i++) CopyVertices(&Grp[i], oapiMeshGroupEx(hMesh, i));
424+
425+ pGrpTF = new D3DXMATRIX[nGrp];
426+
427+ D3DXMatrixIdentity(&mTransform);
428+ D3DXMatrixIdentity(&mTransformInv);
429+
430+ UpdateBoundingBox();
431+ CheckMeshStatus();
432+
433+ pBuf->Map(pDev);
297434 }
298435
299436
@@ -302,14 +439,16 @@
302439 void D3D9Mesh::LoadMeshFromHandle(MESHHANDLE hMesh, D3DXVECTOR3 *reorig, float *scale)
303440 {
304441 nGrp = oapiMeshGroupCount(hMesh);
442+
305443 if (nGrp == 0) return;
306444
307445 Grp = new GROUPREC[nGrp]; memset2(Grp, 0, sizeof(GROUPREC) * nGrp);
446+
308447 for (DWORD i = 0; i<nGrp; i++) SetGroupRec(i, oapiMeshGroupEx(hMesh, i));
448+
309449 if (MaxVert == 0 || MaxFace == 0) return;
310450
311- HR(pDev->CreateVertexBuffer(MaxVert*sizeof(NMVERTEX), 0, 0, D3DPOOL_DEFAULT, &pVB, NULL));
312- HR(pDev->CreateIndexBuffer(MaxFace*sizeof(WORD) * 3, 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &pIB, NULL));
451+ pBuf = new MeshBuffer(MaxVert, MaxFace, this);
313452
314453 // -----------------------------------------------------------------------
315454 nTex = oapiMeshTextureCount(hMesh) + 1;
@@ -330,57 +469,24 @@
330469
331470 D3DXMatrixIdentity(&mTransform);
332471 D3DXMatrixIdentity(&mTransformInv);
333- MeshCatalog->Add(this);
334472
335473 UpdateBoundingBox();
336- UpdateGeometryBuffer();
337474 CheckMeshStatus();
338475 }
339476
340477
341478 // ===========================================================================================
342479 //
343-void D3D9Mesh::ConvertToDynamic()
344-{
345- if (bDynamic) return;
346- bDynamic = true;
347-
348- LPDIRECT3DVERTEXBUFFER9 pVN = NULL;
349- LPDIRECT3DINDEXBUFFER9 pIN = NULL;
350-
351- HR(pDev->CreateVertexBuffer(MaxVert*sizeof(NMVERTEX), D3DUSAGE_DYNAMIC, 0, D3DPOOL_DEFAULT, &pVN, NULL));
352- HR(pDev->CreateIndexBuffer(MaxFace*sizeof(WORD) * 3, D3DUSAGE_DYNAMIC, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &pIN, NULL));
353- LPVOID pSrc, pTgt;
354-
355- HR(pVB->Lock(0, 0, (LPVOID*)&pSrc, 0));
356- HR(pVN->Lock(0, 0, (LPVOID*)&pTgt, 0));
357- memcpy2(pTgt, pSrc, MaxVert*sizeof(NMVERTEX));
358- HR(pVB->Unlock());
359- HR(pVN->Unlock());
360- HR(pIB->Lock(0, 0, (LPVOID*)&pSrc, 0));
361- HR(pIN->Lock(0, 0, (LPVOID*)&pTgt, 0));
362- memcpy2(pTgt, pSrc, MaxFace * 6);
363- HR(pIB->Unlock());
364- HR(pIN->Unlock());
365- SAFE_RELEASE(pVB);
366- SAFE_RELEASE(pIB);
367- pVB = pVN;
368- pIB = pIN;
369-}
370-
371-// ===========================================================================================
372-//
373480 void D3D9Mesh::SetName(const char *fname)
374481 {
375482 if (fname) strcpy_s(name,128,fname);
376- if (!pVB) LogErr("No vertices in a mesh [%s]. Invalid Mesh",name);
377483 }
378484
379485 // ===========================================================================================
380486 //
381487 bool D3D9Mesh::HasShadow()
382488 {
383- if (!pVB) return false;
489+ if (!IsOK()) return false;
384490 for (DWORD g=0; g<nGrp; g++) {
385491 if (Grp[g].UsrFlag & 3) continue;
386492 if (Grp[g].IntFlag & 3) continue;
@@ -395,7 +501,7 @@
395501 void D3D9Mesh::ProcessInherit()
396502 {
397503 _TRACE;
398- if (!pVB) return;
504+ if (!IsOK()) return;
399505 if (Grp[0].MtrlIdx == SPEC_INHERIT) Grp[0].MtrlIdx = SPEC_DEFAULT;
400506 if (Grp[0].TexIdx == SPEC_INHERIT) Grp[0].TexIdx = SPEC_DEFAULT;
401507 if (Grp[0].TexIdxEx[0] == SPEC_INHERIT) Grp[0].TexIdxEx[0] = SPEC_DEFAULT;
@@ -421,79 +527,29 @@
421527
422528 // Do some safety checks
423529 if (Grp[i].TexIdx>=nTex) {
424- LogErr("Mesh(0x%X) has a texture index %u in group %u out of range. Constr=%u", this, Grp[i].TexIdx, i, Constr);
530+ LogErr("Mesh(0x%X) has a texture index %u in group %u out of range.", this, Grp[i].TexIdx, i);
425531 Grp[i].TexIdx = 0;
426532 bPopUp = true;
427533 }
428534 if (Grp[i].TexIdxEx[0]>=nTex) {
429- LogErr("Mesh(0x%X) has a night texture index %u in group %u out of range. Constr=%u", this, Grp[i].TexIdxEx[0], i, Constr);
535+ LogErr("Mesh(0x%X) has a night texture index %u in group %u out of range.", this, Grp[i].TexIdxEx[0], i);
430536 Grp[i].TexIdxEx[0] = 0;
431537 bPopUp = true;
432538 }
433539
434540 if (Grp[i].MtrlIdx!=SPEC_DEFAULT) {
435541 if (Grp[i].MtrlIdx>=nMtrl) {
436- LogErr("Mesh(0x%X) has a material index %u in group %u out of range. Constr=%u", this, Grp[i].MtrlIdx, i, Constr);
542+ LogErr("Mesh(0x%X) has a material index %u in group %u out of range.", this, Grp[i].MtrlIdx, i);
437543 Grp[i].MtrlIdx = SPEC_DEFAULT;
438544 bPopUp = true;
439545 }
440546 }
441547 }
442- if (bPopUp) MessageBoxA(NULL, "Invalid Mesh Detected", "D3D9Client Error:",MB_OK);
443-}
444-
445-
446-// ===========================================================================================
447-//
448-void D3D9Mesh::UpdateGeometryBuffer(int grp)
449-{
450- if (!pVB) return;
451-
452- if (!pGB) {
453- HR(pDev->CreateVertexBuffer(MaxVert * sizeof(D3DXVECTOR4), 0, 0, D3DPOOL_DEFAULT, &pGB, NULL));
454- }
455-
456- if (!pGBSys) pGBSys = new D3DXVECTOR3[MaxVert];
457- if (!pIBSys) pIBSys = new WORD[MaxFace * 3];
458-
459-
460- WORD *pIdx = NULL;
461- HR(pIB->Lock(0, 0, (LPVOID*)&pIdx, 0));
462- if (pIdx) {
463- memcpy2(pIBSys, pIdx, MaxFace * 3 * sizeof(WORD));
464- HR(pIB->Unlock());
548+
549+ if (bPopUp) {
550+ assert(false);
551+ MessageBoxA(NULL, "Invalid Mesh Detected", "D3D9Client Error:", MB_OK);
465552 }
466-
467-
468- NMVERTEX *pVSrc = NULL;
469- D3DXVECTOR4 *pVTgt = NULL;
470-
471- HR(pVB->Lock(0, 0, (LPVOID*)&pVSrc, 0));
472- HR(pGB->Lock(0, 0, (LPVOID*)&pVTgt, 0));
473-
474- if (!pVSrc || !pVTgt) {
475- LogErr("UpdateGeometryBuffer() Failed to lock a buffer");
476- return;
477- }
478-
479- if (grp == -1) {
480- for (DWORD v = 0; v < MaxVert; v++) {
481- pVTgt[v] = D3DXVECTOR4(pVSrc[v].x, pVSrc[v].y, pVSrc[v].z, 0);
482- pGBSys[v] = D3DXVECTOR3(pVSrc[v].x, pVSrc[v].y, pVSrc[v].z);
483- }
484- }
485- else {
486- DWORD nV = Grp[grp].nVert;
487- DWORD vo = Grp[grp].VertOff;
488- for (DWORD v = 0; v < nV; v++) {
489- int x = vo + v;
490- pVTgt[x] = D3DXVECTOR4(pVSrc[x].x, pVSrc[x].y, pVSrc[x].z, 0);
491- pGBSys[x] = D3DXVECTOR3(pVSrc[x].x, pVSrc[x].y, pVSrc[x].z);
492- }
493- }
494-
495- HR(pVB->Unlock());
496- HR(pGB->Unlock());
497553 }
498554
499555
@@ -501,7 +557,7 @@
501557 //
502558 D3DXVECTOR3 D3D9Mesh::GetGroupSize(DWORD idx)
503559 {
504- if (!pVB) return D3DXVECTOR3(0,0,0);
560+ if (!IsOK()) return D3DXVECTOR3(0,0,0);
505561 if (idx>=nGrp) return D3DXVECTOR3(0,0,0);
506562 if (Grp[idx].nVert<2) return D3DXVECTOR3(0,0,0);
507563 return D3DXVECTOR3f4(Grp[idx].BBox.max - Grp[idx].BBox.min);
@@ -513,7 +569,7 @@
513569 void D3D9Mesh::ResetTransformations()
514570 {
515571 _TRACE;
516- if (!pVB) return;
572+ if (!IsOK()) return;
517573 D3DXMatrixIdentity(&mTransform);
518574 D3DXMatrixIdentity(&mTransformInv);
519575 bGlobalTF = false;
@@ -531,7 +587,7 @@
531587 //
532588 void D3D9Mesh::UpdateTangentSpace(NMVERTEX *pVrt, WORD *pIdx, DWORD nVtx, DWORD nFace, bool bTextured)
533589 {
534- if (!pVB) return;
590+ if (!IsOK()) return;
535591
536592 if (bTextured) {
537593
@@ -589,86 +645,28 @@
589645 }
590646 }
591647
592-/*void D3D9Mesh::UpdateTangentSpace(NMVERTEX *pVrt, WORD *pIdx, DWORD nVtx, DWORD nFace, bool bTextured)
593-{
594- if (!pVB) return;
595-
596- if (bTextured) {
597-
598- D3DXVECTOR3 *ta = new D3DXVECTOR3[nVtx];
599-
600- for (DWORD i = 0; i<nVtx; i++) ta[i] = D3DXVECTOR3(0, 0, 0);
601-
602- for (DWORD i = 0; i<nFace; i++) {
603-
604- DWORD i0 = pIdx[i * 3];
605- DWORD i1 = pIdx[i * 3 + 1];
606- DWORD i2 = pIdx[i * 3 + 2];
607-
608- D3DXVECTOR3 r0 = D3DXVECTOR3(pVrt[i0].x, pVrt[i0].y, pVrt[i0].z);
609- D3DXVECTOR3 r1 = D3DXVECTOR3(pVrt[i1].x, pVrt[i1].y, pVrt[i1].z);
610- D3DXVECTOR3 r2 = D3DXVECTOR3(pVrt[i2].x, pVrt[i2].y, pVrt[i2].z);
611- D3DXVECTOR2 t0 = D3DXVECTOR2(pVrt[i0].u, pVrt[i0].v);
612- D3DXVECTOR2 t1 = D3DXVECTOR2(pVrt[i1].u, pVrt[i1].v);
613- D3DXVECTOR2 t2 = D3DXVECTOR2(pVrt[i2].u, pVrt[i2].v);
614-
615- float u0 = t1.x - t0.x;
616- float v0 = t1.y - t0.y;
617- float u1 = t2.x - t0.x;
618- float v1 = t2.y - t0.y;
619-
620- D3DXVECTOR3 k0 = r1 - r0;
621- D3DXVECTOR3 k1 = r2 - r0;
622-
623- float q = (u0*v1 - u1*v0);
624- if (q == 0) q = 1.0f;
625- else q = 1.0f / q;
626-
627- D3DXVECTOR3 t = ((k0*v1 - k1*v0) * q);
628- ta[i0] += t; ta[i1] += t; ta[i2] += t;
629- pVrt[i0].w = pVrt[i1].w = pVrt[i2].w = (q<0.0f ? 1.0f : -1.0f);
630- }
631-
632- for (DWORD i = 0; i<nVtx; i++) {
633-
634- D3DXVECTOR3 n = D3DXVECTOR3(pVrt[i].nx, pVrt[i].ny, pVrt[i].nz);
635- D3DXVec3Normalize(&n, &n);
636- D3DXVECTOR3 t = (ta[i] - n * D3DXVec3Dot(&ta[i], &n));
637- D3DXVec3Normalize(&t, &t);
638-
639- pVrt[i].tx = t.x;
640- pVrt[i].ty = t.y;
641- pVrt[i].tz = t.z;
642- }
643-
644- delete[]ta;
645- }
646- else {
647- for (DWORD i = 0; i<nVtx; i++) {
648- D3DXVECTOR3 n = D3DXVECTOR3(pVrt[i].nx, pVrt[i].ny, pVrt[i].nz);
649- D3DXVECTOR3 t = Perpendicular(&n);
650- D3DXVec3Normalize(&t, &t);
651- pVrt[i].tx = t.x;
652- pVrt[i].ty = t.y;
653- pVrt[i].tz = t.z;
654- }
655- }
656-}*/
657-
658648
659649 // ===========================================================================================
660650 //
661651 void D3D9Mesh::SetGroupRec(DWORD i, const MESHGROUPEX *mg)
662652 {
663653 if (i>=nGrp) return;
654+
664655 memcpy2(Grp[i].TexIdxEx, mg->TexIdxEx, MAXTEX*sizeof(DWORD));
665656 memcpy2(Grp[i].TexMixEx, mg->TexMixEx, MAXTEX*sizeof(float));
657+
666658 Grp[i].TexIdx = mg->TexIdx;
667659 Grp[i].MtrlIdx = mg->MtrlIdx;
668- Grp[i].FaceOff = MaxFace;
660+ Grp[i].IdexOff = MaxFace*3;
669661 Grp[i].VertOff = MaxVert;
670662 Grp[i].nFace = mg->nIdx/3;
671663 Grp[i].nVert = mg->nVtx;
664+ Grp[i].UsrFlag = mg->UsrFlag;
665+ Grp[i].IntFlag = mg->Flags;
666+ Grp[i].zBias = mg->zBias;
667+
668+ D3DXMatrixIdentity(&Grp[i].Transform);
669+
672670 MaxFace += Grp[i].nFace;
673671 MaxVert += Grp[i].nVert;
674672 }
@@ -678,20 +676,10 @@
678676 //
679677 bool D3D9Mesh::CopyVertices(GROUPREC *grp, const MESHGROUPEX *mg, D3DXVECTOR3 *reorig, float *scale)
680678 {
681- if (!pVB) return false;
682-
683- grp->UsrFlag = mg->UsrFlag;
684- grp->IntFlag = mg->Flags;
685- grp->zBias = mg->zBias;
686-
687- D3DXMatrixIdentity(&grp->Transform);
688-
689- WORD *pIndex;
690- NMVERTEX *pVert;
691679 NTVERTEX *pNT = mg->Vtx;
692-
693- HR(pIB->Lock(grp->FaceOff*6, grp->nFace*6, (LPVOID*)&pIndex, 0));
694- HR(pVB->Lock(grp->VertOff*sizeof(NMVERTEX), grp->nVert*sizeof(NMVERTEX), (LPVOID*)&pVert, 0));
680+ NMVERTEX *pVert = pBuf->pVBSys + grp->VertOff;
681+ D3DXVECTOR4 *pGeo = pBuf->pGBSys + grp->VertOff;
682+ WORD *pIndex = pBuf->pIBSys + grp->IdexOff;
695683
696684 for (DWORD i=0;i<mg->nIdx;i++) pIndex[i] = mg->Idx[i];
697685
@@ -715,6 +703,7 @@
715703
716704 pVert[i].u = pNT[i].tu;
717705 pVert[i].v = pNT[i].tv;
706+
718707 pVert[i].w = 1.0f;
719708 pVert[i].tx = 1.0f;
720709 pVert[i].ty = 0.0f;
@@ -725,6 +714,8 @@
725714 pVert[i].y += reorig->y;
726715 pVert[i].z += reorig->z;
727716 }
717+
718+ pGeo[i] = D3DXVECTOR4(pVert[i].x, pVert[i].y, pVert[i].z, 0);
728719 }
729720
730721 // Check vertex index errors (This is important)
@@ -742,74 +733,17 @@
742733 if (mg->nVtx>0) BoundingBox(pVert, mg->nVtx, &grp->BBox);
743734 else D9ZeroAABB(&grp->BBox);
744735
745- HR(pIB->Unlock());
746- HR(pVB->Unlock());
747-
748736 return true;
749737 }
750738
751739
752740 // ===========================================================================================
753-//
754-void D3D9Mesh::UpdateGroup(MESHHANDLE hMesh, DWORD idx)
755-{
756- _TRACE;
757- if (!pVB) return;
758- if (hMesh) {
759- MESHGROUPEX *mg = oapiMeshGroupEx(hMesh, idx);
760- if (mg) {
761- assert(mg->nVtx == Grp[idx].nVert);
762- assert(mg->nIdx == Grp[idx].nFace*3);
763- CopyVertices(&Grp[idx], mg);
764- UpdateGeometryBuffer();
765- }
766- }
767-}
768-
769-
770-// ===========================================================================================
771-// Mesh Update routine for AMSO
772-//
773-void D3D9Mesh::UpdateGroupEx(DWORD idx, const MESHGROUPEX *mg)
774-{
775- _TRACE;
776- if (!pVB) return;
777- GROUPREC *grp = &Grp[idx];
778- NMVERTEX *pVert = LockVertexBuffer(idx,0);
779- NTVERTEX *pNT = mg->Vtx;
780-
781- if (pVert) {
782-
783- for (DWORD i=0;i<mg->nVtx;i++) {
784- pVert[i].x = pNT[i].x;
785- pVert[i].y = pNT[i].y;
786- pVert[i].z = pNT[i].z;
787- }
788-
789- if (Config->UseNormalMap) {
790- WORD *idx=0;
791- if (pIB->Lock(grp->FaceOff*6, grp->nFace*6, (LPVOID*)&idx, 0)==S_OK) {
792- UpdateTangentSpace(pVert, idx, grp->nVert, grp->nFace, grp->TexIdx!=0);
793- pIB->Unlock();
794- }
795- }
796-
797- if (mg->nVtx>0) BoundingBox(pVert, mg->nVtx, &grp->BBox);
798- else D9ZeroAABB(&grp->BBox);
799-
800- UnLockVertexBuffer();
801- UpdateGeometryBuffer();
802- }
803-}
804-
805-
806-// ===========================================================================================
807741 // This is required by Client implementation see clbkEditMeshGroup
808742 //
809743 int D3D9Mesh::EditGroup(DWORD grp, GROUPEDITSPEC *ges)
810744 {
811745 _TRACE;
812- if (!pVB) return 1;
746+ if (!IsOK()) return 1;
813747 if (grp >= nGrp) return 1;
814748
815749 bBSRecompute = true;
@@ -824,9 +758,20 @@
824758
825759 if (flag & GRPEDIT_VTX) {
826760
827- if (!bDynamic) ConvertToDynamic();
828-
829- NMVERTEX *vtx = LockVertexBuffer(grp,0);
761+ if (pBuf->IsLocalTo(this) == false)
762+ {
763+ // Can't make modifications to a global template
764+ // Create a local copy of the Mesh
765+ // TODO: Create local copy of the group only
766+ pBuf = new MeshBuffer(pBuf, this);
767+ }
768+
769+ pBuf->MustRemap(MAPMODE_CURRENT);
770+
771+ D3DXVECTOR4 *pGeo = pBuf->pGBSys + g->VertOff;
772+ NMVERTEX *vtx = pBuf->pVBSys + g->VertOff;
773+ WORD *idx = pBuf->pIBSys + g->IdexOff;
774+
830775 DWORD i, vi;
831776 if (vtx) {
832777 for (i = 0; i < ges->nVtx; i++) {
@@ -849,21 +794,17 @@
849794 else if (flag & GRPEDIT_VTXTEXADDU) vtx[vi].u += ges->Vtx[i].tu;
850795 if (flag & GRPEDIT_VTXTEXV) vtx[vi].v = ges->Vtx[i].tv;
851796 else if (flag & GRPEDIT_VTXTEXADDV) vtx[vi].v += ges->Vtx[i].tv;
797+
798+ if ((flag & GRPEDIT_VTXCRD)!=0 || (flag & GRPEDIT_VTXCRDADD)!=0) {
799+ pGeo[vi] = D3DXVECTOR4(vtx[vi].x, vtx[vi].y, vtx[vi].z, 0);
800+ }
852801 }
853802 }
854803
855- if (Config->UseNormalMap) {
856- WORD *idx=0;
857- if (pIB->Lock(g->FaceOff*6, g->nFace*6, (LPVOID*)&idx, D3DLOCK_READONLY)==S_OK) {
858- UpdateTangentSpace(vtx, idx, g->nVert, g->nFace, g->TexIdx!=0);
859- pIB->Unlock();
860- }
861- }
804+ if (Config->UseNormalMap) UpdateTangentSpace(vtx, idx, g->nVert, g->nFace, g->TexIdx!=0);
862805
863806 if (g->nVert>0) BoundingBox(vtx, g->nVert, &g->BBox);
864807 else D9ZeroAABB(&g->BBox);
865-
866- UnLockVertexBuffer();
867808 }
868809 }
869810 return 0;
@@ -890,7 +831,7 @@
890831 int ret = 0;
891832
892833 if (grs->nVtx && grs->Vtx) { // vertex data requested
893- NMVERTEX *vtx = LockVertexBuffer(grp, D3DLOCK_READONLY);
834+ NMVERTEX *vtx = pBuf->pVBSys + Grp[grp].VertOff;
894835 if (vtx) {
895836 if (grs->VtxPerm) { // random access data request
896837 for (i = 0; i < grs->nVtx; i++) {
@@ -906,13 +847,12 @@
906847 if (grs->nVtx > nv) grs->nVtx = nv;
907848 for (i=0;i<grs->nVtx;i++) grs->Vtx[i] = Convert(vtx[i]);
908849 }
909- UnLockVertexBuffer();
910850 }
911851 else return 1;
912852 }
913853
914854 if (grs->nIdx && grs->Idx) { // index data requested
915- WORD *idx = LockIndexBuffer(grp, D3DLOCK_READONLY);
855+ WORD *idx = pBuf->pIBSys + Grp[grp].IdexOff;
916856 if (idx) {
917857 if (grs->IdxPerm) { // random access data request
918858 for (i = 0; i < grs->nIdx; i++) {
@@ -928,7 +868,6 @@
928868 if (grs->nIdx > ni) grs->nIdx = ni;
929869 for (i=0;i<grs->nIdx;i++) grs->Idx[i] = idx[i];
930870 }
931- UnLockIndexBuffer();
932871 }
933872 else return 1;
934873 }
@@ -950,7 +889,7 @@
950889 bool D3D9Mesh::SetTexture(DWORD texidx, LPD3D9CLIENTSURFACE tex)
951890 {
952891 _TRACE;
953- if (!pVB) return false;
892+ if (!IsOK()) return false;
954893 if (texidx >= nTex) {
955894 LogErr("D3D9Mesh::SetTexture(%u, 0x%X) index out of range",texidx,tex);
956895 return false;
@@ -965,7 +904,7 @@
965904 //
966905 DWORD D3D9Mesh::GetMeshGroupMaterialIdx(DWORD idx) const
967906 {
968- if (!pVB) return 0;
907+ if (!IsOK()) return 0;
969908 if (idx>=nGrp) return 0;
970909 return Grp[idx].MtrlIdx;
971910 }
@@ -974,7 +913,7 @@
974913 //
975914 DWORD D3D9Mesh::GetMeshGroupTextureIdx(DWORD idx) const
976915 {
977- if (!pVB) return 0;
916+ if (!IsOK()) return 0;
978917 if (idx>=nGrp) return 0;
979918 return Grp[idx].TexIdx;
980919 }
@@ -983,7 +922,7 @@
983922 //
984923 bool D3D9Mesh::HasTexture(SURFHANDLE hSurf)
985924 {
986- if (!pVB) return false;
925+ if (!IsOK()) return false;
987926 for (DWORD i=0;i<nTex;i++) if (Tex[i]==hSurf) return true;
988927 return false;
989928 }
@@ -993,7 +932,7 @@
993932 void D3D9Mesh::SetTexMixture(DWORD ntex, float mix)
994933 {
995934 _TRACE;
996- if (!pVB) return;
935+ if (!IsOK()) return;
997936 ntex--;
998937 for (DWORD g = 0; g < nGrp; g++) if (Grp[g].TexIdxEx[ntex] != SPEC_DEFAULT) Grp[g].TexMixEx[ntex] = mix;
999938 }
@@ -1002,75 +941,9 @@
1002941 //
1003942 void D3D9Mesh::SetSunLight(const D3D9Sun *light)
1004943 {
1005- if (!pVB) return;
1006944 sunLight = light;
1007945 }
1008946
1009-
1010-// ===========================================================================================
1011-//
1012-NMVERTEX * D3D9Mesh::LockVertexBuffer(DWORD grp, DWORD flags)
1013-{
1014- if (!pVB) return NULL;
1015- NMVERTEX *pVert;
1016- bBSRecompute = true;
1017-
1018- if (grp>=nGrp) {
1019- LogErr("D3D9Mesh(0x%X)::GetVertexBuffer(%u) index out of range",this,grp);
1020- return NULL;
1021- }
1022-
1023- double time = D3D9GetTime();
1024-
1025- if (pVB->Lock(Grp[grp].VertOff*sizeof(NMVERTEX), Grp[grp].nVert*sizeof(NMVERTEX), (LPVOID*)&pVert, flags)==S_OK) {
1026- D3D9SetTime(D3D9Stats.Timer.LockWait, time);
1027- return pVert;
1028- }
1029- else {
1030- LogErr("D3D9Mesh(0x%X)::GetVertexBuffer(%u)",this,grp);
1031- return NULL;
1032- }
1033-}
1034-
1035-// ===========================================================================================
1036-//
1037-void D3D9Mesh::UnLockVertexBuffer()
1038-{
1039- if (!pVB) return;
1040- HR(pVB->Unlock());
1041-}
1042-
1043-// ===========================================================================================
1044-//
1045-
1046-WORD * D3D9Mesh::LockIndexBuffer(DWORD grp, DWORD flags)
1047-{
1048- if (!pIB) return NULL;
1049- WORD *pIdx;
1050- bBSRecompute = true;
1051-
1052- if (grp>=nGrp) {
1053- LogErr("D3D9Mesh(0x%X)::LockIndexBuffer(%u) index out of range",this,grp);
1054- return NULL;
1055- }
1056-
1057- if (pIB->Lock(Grp[grp].FaceOff*6, Grp[grp].nFace*6, (LPVOID*)&pIdx, flags)==S_OK) {
1058- return pIdx;
1059- }
1060- else {
1061- LogErr("D3D9Mesh(0x%X)::LockIndexBuffer(%u)",this,grp);
1062- return NULL;
1063- }
1064-}
1065-
1066-// ===========================================================================================
1067-//
1068-void D3D9Mesh::UnLockIndexBuffer()
1069-{
1070- if (!pIB) return;
1071- HR(pIB->Unlock());
1072-}
1073-
1074947 // ===========================================================================================
1075948 //
1076949 DWORD D3D9Mesh::GetVertexCount(int grp) const
@@ -1100,7 +973,7 @@
1100973 //
1101974 const D3D9Mesh::GROUPREC *D3D9Mesh::GetGroup(DWORD idx) const
1102975 {
1103- if (!pVB) return NULL;
976+ if (!IsOK()) return NULL;
1104977 if (idx<nGrp) return &Grp[idx];
1105978 return NULL;
1106979 }
@@ -1129,7 +1002,10 @@
11291002 void D3D9Mesh::SetMaterial(const D3DMATERIAL9 *pMat, DWORD idx, bool bStat)
11301003 {
11311004 D3D9MatExt Mat;
1132- CreateMatExt(pMat, &Mat);
1005+ if (pMat == NULL) {
1006+ LogErr("MeshMaterial is NULL, likely from oapiMeshMaterial() name=[%s], index=%d", name, idx);
1007+ CreateDefaultMat(&Mat);
1008+ } else CreateMatExt(pMat, &Mat);
11331009 SetMaterial(&Mat, idx, bStat);
11341010 }
11351011
@@ -1321,7 +1197,7 @@
13211197 void D3D9Mesh::SetAmbientColor(D3DCOLOR c)
13221198 {
13231199 _TRACE;
1324- if (!pVB) return;
1200+ if (!IsOK()) return;
13251201 cAmbient = c;
13261202 }
13271203
@@ -1330,7 +1206,7 @@
13301206 void D3D9Mesh::SetupFog(const LPD3DXMATRIX pW)
13311207 {
13321208 _TRACE;
1333- if (!pVB) return;
1209+ if (!IsOK()) return;
13341210 FX->SetVector(eAttennuate, &D3DXVECTOR4(1,1,1,1));
13351211 FX->SetVector(eInScatter, &D3DXVECTOR4(0,0,0,0));
13361212 }
@@ -1347,12 +1223,14 @@
13471223 void D3D9Mesh::RenderGroup(const GROUPREC *grp)
13481224 {
13491225 _TRACE;
1350- if (!pVB) return;
1226+ if (!IsOK()) return;
13511227 if (!grp) return;
1228+ pBuf->Map(pDev);
1229+
13521230 pDev->SetVertexDeclaration(pMeshVertexDecl);
1353- pDev->SetStreamSource(0, pVB, 0, sizeof(NMVERTEX));
1354- pDev->SetIndices(pIB);
1355- pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, grp->VertOff, 0, grp->nVert, grp->FaceOff*3, grp->nFace);
1231+ pDev->SetStreamSource(0, pBuf->pVB, 0, sizeof(NMVERTEX));
1232+ pDev->SetIndices(pBuf->pIB);
1233+ pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, grp->VertOff, 0, grp->nVert, grp->IdexOff, grp->nFace);
13561234 D3D9Stats.Mesh.Vertices += grp->nVert;
13571235 D3D9Stats.Mesh.MeshGrps++;
13581236 }
@@ -1435,6 +1313,10 @@
14351313 {
14361314
14371315 _TRACE;
1316+
1317+ if (!IsOK()) return;
1318+
1319+ pBuf->Map(pDev);
14381320
14391321 // Check material status
14401322 //
@@ -1455,9 +1337,6 @@
14551337
14561338 const VCHUDSPEC *hudspec;
14571339
1458- if (!pVB) return;
1459-
1460-
14611340 if (DebugControls::IsActive()) {
14621341 flags = *(DWORD*)gc->GetConfigParam(CFGPRM_GETDEBUGFLAGS);
14631342 selmsh = *(DWORD*)gc->GetConfigParam(CFGPRM_GETSELECTEDMESH);
@@ -1529,8 +1408,8 @@
15291408 LPD3D9CLIENTSURFACE old_tex = NULL;
15301409
15311410 pDev->SetVertexDeclaration(pMeshVertexDecl);
1532- pDev->SetStreamSource(0, pVB, 0, sizeof(NMVERTEX));
1533- pDev->SetIndices(pIB);
1411+ pDev->SetStreamSource(0, pBuf->pVB, 0, sizeof(NMVERTEX));
1412+ pDev->SetIndices(pBuf->pIB);
15341413
15351414 if (flags&DBG_FLAGS_DUALSIDED) pDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
15361415
@@ -1904,11 +1783,11 @@
19041783 if (Grp[g].bDualSided) {
19051784 pDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
19061785 pDev->SetRenderState(D3DRS_ZWRITEENABLE, 0);
1907- pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, Grp[g].VertOff, 0, Grp[g].nVert, Grp[g].FaceOff * 3, Grp[g].nFace);
1786+ pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, Grp[g].VertOff, 0, Grp[g].nVert, Grp[g].IdexOff, Grp[g].nFace);
19081787 pDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
19091788 }
19101789
1911- pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, Grp[g].VertOff, 0, Grp[g].nVert, Grp[g].FaceOff*3, Grp[g].nFace);
1790+ pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, Grp[g].VertOff, 0, Grp[g].nVert, Grp[g].IdexOff, Grp[g].nFace);
19121791
19131792 Grp[g].bRendered = true;
19141793
@@ -1950,7 +1829,9 @@
19501829
19511830 const VCHUDSPEC *hudspec;
19521831
1953- if (!pVB) return;
1832+ if (!IsOK()) return;
1833+
1834+ pBuf->Map(pDev);
19541835
19551836 if (DebugControls::IsActive()) {
19561837 flags = *(DWORD*)gc->GetConfigParam(CFGPRM_GETDEBUGFLAGS);
@@ -2022,8 +1903,8 @@
20221903 LPDIRECT3DTEXTURE9 pEmis_old = NULL;
20231904
20241905 pDev->SetVertexDeclaration(pMeshVertexDecl);
2025- pDev->SetStreamSource(0, pVB, 0, sizeof(NMVERTEX));
2026- pDev->SetIndices(pIB);
1906+ pDev->SetStreamSource(0, pBuf->pVB, 0, sizeof(NMVERTEX));
1907+ pDev->SetIndices(pBuf->pIB);
20271908
20281909 if (flags&DBG_FLAGS_DUALSIDED) pDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
20291910
@@ -2239,11 +2120,11 @@
22392120 if (Grp[g].bDualSided) {
22402121 pDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
22412122 pDev->SetRenderState(D3DRS_ZWRITEENABLE, 0);
2242- pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, Grp[g].VertOff, 0, Grp[g].nVert, Grp[g].FaceOff * 3, Grp[g].nFace);
2123+ pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, Grp[g].VertOff, 0, Grp[g].nVert, Grp[g].IdexOff, Grp[g].nFace);
22432124 pDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
22442125 }
22452126
2246- pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, Grp[g].VertOff, 0, Grp[g].nVert, Grp[g].FaceOff * 3, Grp[g].nFace);
2127+ pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, Grp[g].VertOff, 0, Grp[g].nVert, Grp[g].IdexOff, Grp[g].nFace);
22472128
22482129 Grp[g].bRendered = true;
22492130
@@ -2320,7 +2201,7 @@
23202201 //
23212202 void D3D9Mesh::RenderBaseTile(const LPD3DXMATRIX pW)
23222203 {
2323- if (!pVB) return;
2204+ if (!IsOK()) return;
23242205
23252206 Scene *scn = gc->GetScene();
23262207
@@ -2338,8 +2219,8 @@
23382219 LPDIRECT3DTEXTURE9 pNorm = NULL;
23392220
23402221 pDev->SetVertexDeclaration(pMeshVertexDecl);
2341- pDev->SetStreamSource(0, pVB, 0, sizeof(NMVERTEX));
2342- pDev->SetIndices(pIB);
2222+ pDev->SetStreamSource(0, pBuf->pVB, 0, sizeof(NMVERTEX));
2223+ pDev->SetIndices(pBuf->pIB);
23432224
23442225 if (sunLight) FX->SetValue(eSun, sunLight, sizeof(D3D9Sun));
23452226
@@ -2431,7 +2312,7 @@
24312312
24322313 FX->CommitChanges();
24332314
2434- pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, Grp[g].VertOff, 0, Grp[g].nVert, Grp[g].FaceOff*3, Grp[g].nFace);
2315+ pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, Grp[g].VertOff, 0, Grp[g].nVert, Grp[g].IdexOff, Grp[g].nFace);
24352316
24362317 D3D9Stats.Mesh.Vertices += Grp[g].nVert;
24372318 D3D9Stats.Mesh.MeshGrps++;
@@ -2446,7 +2327,7 @@
24462327 //
24472328 void D3D9Mesh::RenderShadows(float alpha, const LPD3DXMATRIX pW, bool bShadowMap)
24482329 {
2449- if (!pIB || !pGB) return;
2330+ if (!IsOK()) return;
24502331
24512332 D3DXMATRIX GroupMatrix, mWorldMesh; UINT numPasses = 0;
24522333
@@ -2456,8 +2337,8 @@
24562337 D3D9Stats.Mesh.Meshes++;
24572338
24582339 pDev->SetVertexDeclaration(pVector4Decl);
2459- pDev->SetStreamSource(0, pGB, 0, sizeof(D3DXVECTOR4));
2460- pDev->SetIndices(pIB);
2340+ pDev->SetStreamSource(0, pBuf->pGB, 0, sizeof(D3DXVECTOR4));
2341+ pDev->SetIndices(pBuf->pIB);
24612342
24622343 //if (bShadowMap) pDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
24632344
@@ -2504,7 +2385,7 @@
25042385 }
25052386 }
25062387
2507- pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, Grp[g].VertOff, 0, Grp[g].nVert, Grp[g].FaceOff * 3, Grp[g].nFace);
2388+ pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, Grp[g].VertOff, 0, Grp[g].nVert, Grp[g].IdexOff, Grp[g].nFace);
25082389
25092390 D3D9Stats.Mesh.Vertices += Grp[g].nVert;
25102391 D3D9Stats.Mesh.MeshGrps++;
@@ -2524,13 +2405,13 @@
25242405 //
25252406 void D3D9Mesh::RenderShadowsEx(float alpha, const LPD3DXMATRIX pP, const LPD3DXMATRIX pW, const D3DXVECTOR4 *light, const D3DXVECTOR4 *param)
25262407 {
2527- if (!pVB || !pGB) return;
2408+ if (!IsOK()) return;
25282409
25292410 D3D9Stats.Mesh.Meshes++;
25302411
25312412 pDev->SetVertexDeclaration(pVector4Decl);
2532- pDev->SetStreamSource(0, pGB, 0, sizeof(D3DXVECTOR4));
2533- pDev->SetIndices(pIB);
2413+ pDev->SetStreamSource(0, pBuf->pGB, 0, sizeof(D3DXVECTOR4));
2414+ pDev->SetIndices(pBuf->pIB);
25342415
25352416 FX->SetTechnique(eShadowTech);
25362417 FX->SetMatrix(eW, pW);
@@ -2548,7 +2429,7 @@
25482429 if (Grp[g].UsrFlag & 0x3) continue;
25492430 if (Grp[g].IntFlag & 0x3) continue;
25502431
2551- pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, Grp[g].VertOff, 0, Grp[g].nVert, Grp[g].FaceOff * 3, Grp[g].nFace);
2432+ pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, Grp[g].VertOff, 0, Grp[g].nVert, Grp[g].IdexOff, Grp[g].nFace);
25522433
25532434 D3D9Stats.Mesh.Vertices += Grp[g].nVert;
25542435 D3D9Stats.Mesh.MeshGrps++;
@@ -2567,7 +2448,7 @@
25672448 {
25682449 _TRACE;
25692450
2570- if (!pVB) return;
2451+ if (!IsOK()) return;
25712452 if (DebugControls::IsActive()==false) return;
25722453
25732454 D3DXMATRIX q, qq;
@@ -2663,27 +2544,6 @@
26632544
26642545 // ===========================================================================================
26652546 //
2666-/*void D3D9Mesh::BoundingBox(const NMVERTEX *vtx, DWORD n, D9BBox *box)
2667-{
2668- if (!pVB) return;
2669- box->min.x = box->max.x = vtx[0].x;
2670- box->min.y = box->max.y = vtx[0].y;
2671- box->min.z = box->max.z = vtx[0].z;
2672-
2673- for (DWORD i=1;i<n;i++) {
2674- if (vtx[i].x < box->min.x) box->min.x=vtx[i].x;
2675- else if (vtx[i].x > box->max.x) box->max.x=vtx[i].x;
2676- if (vtx[i].y < box->min.y) box->min.y=vtx[i].y;
2677- else if (vtx[i].y > box->max.y) box->max.y = vtx[i].y;
2678- if (vtx[i].z < box->min.z) box->min.z=vtx[i].z;
2679- else if (vtx[i].z > box->max.z) box->max.z=vtx[i].z;
2680- }
2681-
2682- box->min.w = box->max.w = 0.0f;
2683-}*/
2684-
2685-// ===========================================================================================
2686-//
26872547
26882548 void D3D9Mesh::BoundingBox(const NMVERTEX *vtx, DWORD n, D9BBox *box)
26892549 {
@@ -2702,7 +2562,7 @@
27022562 //
27032563 void D3D9Mesh::TransformGroup(DWORD n, const D3DXMATRIX *m)
27042564 {
2705- if (!pVB) return;
2565+ if (!IsOK()) return;
27062566
27072567 bBSRecompute = true;
27082568
@@ -2717,7 +2577,7 @@
27172577 //
27182578 void D3D9Mesh::Transform(const D3DXMATRIX *m)
27192579 {
2720- if (!pVB) return;
2580+ if (!IsOK()) return;
27212581
27222582 bBSRecompute = true;
27232583 bBSRecomputeAll = true;
@@ -2770,7 +2630,7 @@
27702630 //
27712631 void D3D9Mesh::UpdateBoundingBox()
27722632 {
2773- if (!pVB) return;
2633+ if (!IsOK()) return;
27742634 if (bBSRecompute==false) return;
27752635
27762636 for (DWORD i=0;i<nGrp;i++) {
@@ -2818,7 +2678,7 @@
28182678 //
28192679 D9BBox * D3D9Mesh::GetAABB()
28202680 {
2821- if (!pVB) return false;
2681+ if (!IsOK()) return false;
28222682 UpdateBoundingBox();
28232683 return &BBox;
28242684 }
@@ -2827,7 +2687,7 @@
28272687 //
28282688 D3DXVECTOR3 D3D9Mesh::GetBoundingSpherePos()
28292689 {
2830- if (!pVB) return D3DXVECTOR3(0,0,0);
2690+ if (!IsOK()) return D3DXVECTOR3(0,0,0);
28312691 UpdateBoundingBox();
28322692 return D3DXVECTOR3f4(BBox.bs);
28332693 }
@@ -2836,7 +2696,7 @@
28362696 //
28372697 float D3D9Mesh::GetBoundingSphereRadius()
28382698 {
2839- if (!pVB) return 0.0f;
2699+ if (!IsOK()) return 0.0f;
28402700 UpdateBoundingBox();
28412701 return BBox.bs.w;
28422702 }
@@ -2852,7 +2712,7 @@
28522712 result.group = -1;
28532713 result.idx = -1;
28542714
2855- if (!pGBSys || !pIBSys) {
2715+ if (!pBuf->pGBSys || !pBuf->pIBSys) {
28562716 LogErr("D3D9Mesh::Pick() Failed: No Geometry Available");
28572717 return result;
28582718 }
@@ -2887,8 +2747,8 @@
28872747
28882748 D3DXVECTOR3 _a, _b, _c, cp;
28892749
2890- WORD *pIdc = &pIBSys[Grp[g].FaceOff*3];
2891- D3DXVECTOR3 *pVrt = &pGBSys[Grp[g].VertOff];
2750+ WORD *pIdc = pBuf->pIBSys + Grp[g].IdexOff;
2751+ D3DXVECTOR4 *pVrt = pBuf->pGBSys + Grp[g].VertOff;
28922752
28932753 D3DXMATRIX mWI; float det;
28942754 D3DXMatrixInverse(&mWI, &det, &mW);
@@ -2904,9 +2764,9 @@
29042764 WORD b = pIdc[i*3+1];
29052765 WORD c = pIdc[i*3+2];
29062766
2907- _a = pVrt[a];
2908- _b = pVrt[b];
2909- _c = pVrt[c];
2767+ _a = D3DXVECTOR3f4(pVrt[a]);
2768+ _b = D3DXVECTOR3f4(pVrt[b]);
2769+ _c = D3DXVECTOR3f4(pVrt[c]);
29102770
29112771 float u, v, dst;
29122772
@@ -2945,16 +2805,16 @@
29452805
29462806 D3DXVECTOR3 cp;
29472807
2948- WORD *pIdc = &pIBSys[Grp[g].FaceOff * 3];
2949- D3DXVECTOR3 *pVrt = &pGBSys[Grp[g].VertOff];
2808+ WORD *pIdc = &pBuf->pIBSys[Grp[g].IdexOff];
2809+ D3DXVECTOR4 *pVrt = &pBuf->pGBSys[Grp[g].VertOff];
29502810
29512811 WORD a = pIdc[i * 3 + 0];
29522812 WORD b = pIdc[i * 3 + 1];
29532813 WORD c = pIdc[i * 3 + 2];
29542814
2955- D3DXVECTOR3 _a = pVrt[a];
2956- D3DXVECTOR3 _b = pVrt[b];
2957- D3DXVECTOR3 _c = pVrt[c];
2815+ D3DXVECTOR3 _a = D3DXVECTOR3f4(pVrt[a]);
2816+ D3DXVECTOR3 _b = D3DXVECTOR3f4(pVrt[b]);
2817+ D3DXVECTOR3 _c = D3DXVECTOR3f4(pVrt[c]);
29582818
29592819 float u = result.u;
29602820 float v = result.v;
@@ -2971,32 +2831,6 @@
29712831 return result;
29722832 }
29732833
2974-// ===========================================================================================
2975-//
2976-void D3D9Mesh::DumpTextures()
2977-{
2978- /*
2979- LogBlu("Mesh 0x%X has %u textures",this, nTex-1);
2980- if (Tex[0]!=NULL) LogErr("Texture in index 0");
2981- for (DWORD i=1;i<nTex;i++) {
2982- if (Tex[i]) LogBlu("Texture %u: 0x%X (%s)", i, Tex[i], Tex[i]->GetName());
2983- else LogBlu("Texture %u: NULL");
2984- }*/
2985-}
2986-
2987-// ===========================================================================================
2988-//
2989-void D3D9Mesh::DumpGroups()
2990-{
2991- /*
2992- LogAlw("Mesh 0x%X has %u groups", this, nGrp);
2993- for (DWORD i=0;i<nGrp;i++) {
2994- LogAlw("Group(%u):",i);
2995- LogAlw("VertexCount = %u",Grp[i].nVert);
2996- LogAlw("FaceCount = %u",Grp[i].nFace);
2997- }*/
2998-}
2999-
30002834
30012835
30022836 // ===========================================================================================
@@ -3027,7 +2861,7 @@
30272861 void D3D9Mesh::RenderRings(const LPD3DXMATRIX pW, LPDIRECT3DTEXTURE9 pTex)
30282862 {
30292863 _TRACE;
3030- if (!pVB) return;
2864+ if (!IsOK()) return;
30312865 if (!pTex) return;
30322866
30332867 D3D9Stats.Mesh.Vertices += Grp[0].nVert;
@@ -3051,7 +2885,7 @@
30512885 void D3D9Mesh::RenderRings2(const LPD3DXMATRIX pW, LPDIRECT3DTEXTURE9 pTex, float irad, float orad)
30522886 {
30532887 _TRACE;
3054- if (!pVB) return;
2888+ if (!IsOK()) return;
30552889 if (!pTex) return;
30562890
30572891 D3D9Stats.Mesh.Vertices += Grp[0].nVert;
@@ -3069,77 +2903,4 @@
30692903 RenderGroup(0);
30702904 HR(FX->EndPass());
30712905 HR(FX->End());
3072-}
3073-
3074-
3075-
3076-
3077-
3078-// ===========================================================================================
3079-// MESH EDITING SECTION
3080-// ===========================================================================================
3081-//
3082-DWORD D3D9Mesh::AddTexture(D3D9ClientSurface *pTex)
3083-{
3084- SAFE_DELETEA(pTune);
3085-
3086- void *pBak = Tex;
3087-
3088- if (nTex==0) {
3089- nTex = 2;
3090- Tex = new LPD3D9CLIENTSURFACE[nTex];
3091- Tex[0] = NULL; Tex[1] = pTex;
3092- return nTex-1;
3093- } else if (pBak) {
3094- Tex = new LPD3D9CLIENTSURFACE[nTex+1];
3095- memcpy(Tex, pBak, sizeof(LPD3D9CLIENTSURFACE) * nTex);
3096- delete []pBak;
3097- Tex[nTex] = pTex;
3098- nTex++;
3099- return nTex-1;
3100- }
3101- return 0;
3102-}
3103-
3104-
3105-// ===========================================================================================
3106-//
3107-DWORD D3D9Mesh::AddMaterial(D3D9MatExt *pMat)
3108-{
3109- void *pBak = Mtrl;
3110- Mtrl = new D3D9MatExt[nMtrl+1];
3111- if (pBak) {
3112- memcpy(Mtrl, pBak, sizeof(D3D9MatExt)*nMtrl);
3113- delete []pBak;
3114- }
3115- memcpy(&Mtrl[nMtrl], pMat, sizeof(D3D9MatExt));
3116- nMtrl++;
3117- return nMtrl-1;
3118-}
3119-
3120-
3121-// ===========================================================================================
3122-//
3123-void D3D9Mesh::SetMeshGroupTextureIdx(DWORD grp, DWORD tex_idx)
3124-{
3125- Grp[grp].TexIdx = tex_idx;
3126-}
3127-
3128-
3129-// ===========================================================================================
3130-//
3131-void D3D9Mesh::SetMeshGroupMaterialIdx(DWORD grp, DWORD mtrl_idx)
3132-{
3133- Grp[grp].MtrlIdx = mtrl_idx;
3134-}
3135-
3136-
3137-// ===========================================================================================
3138-//
3139-bool D3D9Mesh::Bake()
3140-{
3141- UpdateBoundingBox();
3142- UpdateGeometryBuffer();
3143- CheckMeshStatus();
3144- return true;
31452906 }
\ No newline at end of file
diff -r 1f4979392798 -r e20b4b8a0ac2 Orbitersdk/D3D9Client/Mesh.h
--- a/Orbitersdk/D3D9Client/Mesh.h Wed Oct 23 21:44:24 2019 +0000
+++ b/Orbitersdk/D3D9Client/Mesh.h Tue Nov 05 00:28:42 2019 +0000
@@ -3,7 +3,7 @@
33 // Part of the ORBITER VISUALISATION PROJECT (OVP)
44 // Dual licensed under GPL v3 and LGPL v3
55 // Copyright (C) 2006-2016 Martin Schweiger
6-// 2012-2016 Jarmo Nikkanen
6+// 2012-2019 Jarmo Nikkanen
77 // ==============================================================
88
99 // ==============================================================
@@ -49,12 +49,54 @@
4949 #define VCLASS_ULTRA 3
5050 #define VCLASS_SSU_CENTAUR 4
5151
52+#define MAPMODE_UNKNOWN 0
53+#define MAPMODE_CURRENT 1
54+#define MAPMODE_STATIC 2
55+#define MAPMODE_DYNAMIC 3
56+
57+
5258 struct _LightList {
5359 int idx;
5460 float illuminace;
5561 };
5662
5763
64+
65+
66+
67+class MeshBuffer
68+{
69+public:
70+
71+ MeshBuffer(MeshBuffer *pSrc, const class D3D9Mesh *_pRoot);
72+ MeshBuffer(DWORD nVtx, DWORD nIdx, const class D3D9Mesh *_pRoot);
73+ ~MeshBuffer();
74+
75+ void Map(LPDIRECT3DDEVICE9 pDev);
76+ bool IsLocalTo(const class D3D9Mesh *_pRoot) { return (_pRoot == pRoot); }
77+ void MustRemap(DWORD mode);
78+
79+ LPDIRECT3DVERTEXBUFFER9 pVB;
80+ LPDIRECT3DVERTEXBUFFER9 pGB;
81+ LPDIRECT3DINDEXBUFFER9 pIB;
82+
83+ NMVERTEX *pVBSys;
84+ D3DXVECTOR4 *pGBSys;
85+ WORD *pIBSys;
86+
87+ DWORD nVtx;
88+ DWORD nIdx;
89+ DWORD mapMode;
90+ bool bMustRemap;
91+
92+ const class D3D9Mesh *pRoot;
93+};
94+
95+
96+
97+
98+
99+
58100 /**
59101 * \brief Mesh object with D3D9-specific vertex buffer
60102 *
@@ -67,17 +109,20 @@
67109
68110 public:
69111
70- bool bCanRenderFast; // Mesh doesn't contain any advanced features in any group
71- bool bIsReflective; // Mesh has a reflective material in one or more groups
72- bool bMtrlModidied;
112+ bool bCanRenderFast; // Mesh doesn't contain any advanced features in any group
113+ bool bIsReflective; // Mesh has a reflective material in one or more groups
114+ bool bMtrlModidied;
115+ bool bIsTemplate;
73116
74- D9BBox BBox;
75-
76- struct GROUPREC { // mesh group definition
117+ D9BBox BBox;
118+ MeshBuffer * pBuf;
119+
120+struct GROUPREC { // mesh group definition
121+
77122 DWORD VertOff; // Main mesh Vertex Offset
78- DWORD FaceOff; // Main mesh Index Offset
123+ DWORD IdexOff; // Main mesh Index Offset
79124 //------------------------------------------------
80- DWORD nFace; // Face count
125+ DWORD nFace; // Face/Primitive count
81126 DWORD nVert; // Vertex count
82127 //------------------------------------------------
83128 DWORD MtrlIdx; // material index
@@ -93,38 +138,26 @@
93138 bool bDualSided;
94139 bool bDeleted; // This entry is deleted by DelGroup()
95140 bool bRendered;
96- //bool bAdvanced; // This group reguires more advanced shader than default one
97141 D3DXMATRIX Transform; // Group specific transformation matrix
98142 D9BBox BBox;
99143 DWORD TexIdxEx[MAXTEX];
100144 float TexMixEx[MAXTEX];
101145 };
102146
103- explicit D3D9Mesh(const char *name);
104- D3D9Mesh(const D3D9Mesh &mesh) : D3D9Effect() { Copy(mesh); }
105-
106- /**
107- * \brief Create a mesh consisting of a single mesh group
108- * \param client graphics client
109- * \param grp vertex group definition
110- * \param deepcopy if true, group contents are copied; otherwise, group
111- * definition pointer is used directly
112- */
147+
148+ D3D9Mesh(const char *name);
113149 D3D9Mesh(DWORD nGrp, const MESHGROUPEX **hGroup, const SURFHANDLE *hSurf);
114150 D3D9Mesh(const MESHGROUPEX *pGroup, const MATERIAL *pMat, D3D9ClientSurface *pTex);
115151 D3D9Mesh(MESHHANDLE hMesh, bool asTemplate = false, D3DXVECTOR3 *reorig = NULL, float *scale = NULL);
152+ D3D9Mesh(MESHHANDLE hMesh, const D3D9Mesh &hTemp);
116153 ~D3D9Mesh();
117154
118- D3D9Mesh &operator =(const D3D9Mesh &mesh) { Copy(mesh); return *this; }
155+ bool IsOK() const { return pBuf != NULL; }
119156
120157 void Release();
121158
122159 void LoadMeshFromHandle(MESHHANDLE hMesh, D3DXVECTOR3 *reorig = NULL, float *scale = NULL);
123160 void ReLoadMeshFromHandle(MESHHANDLE hMesh);
124- void UnLockVertexBuffer();
125- void UnLockIndexBuffer();
126- NMVERTEX * LockVertexBuffer(DWORD grp, DWORD flags);
127- WORD * LockIndexBuffer(DWORD grp, DWORD flags);
128161
129162 void SetName(const char *name);
130163 const char * GetName() const { return name; }
@@ -212,14 +245,11 @@
212245 void RenderAxisVector(LPD3DXMATRIX pW, const LPD3DXCOLOR pColor, float len);
213246
214247 void CheckMeshStatus();
215- void ConvertToDynamic();
216248 void ResetTransformations();
217249 void TransformGroup(DWORD n, const D3DXMATRIX *m);
218250 void Transform(const D3DXMATRIX *m);
219251 int GetGroup (DWORD grp, GROUPREQUESTSPEC *grs);
220252 int EditGroup (DWORD grp, GROUPEDITSPEC *ges);
221- void UpdateGroupEx(DWORD idx, const MESHGROUPEX *mg);
222- void UpdateGroup(MESHHANDLE hMesh, DWORD idx);
223253
224254 void SetSunLight(const D3D9Sun *pLight);
225255
@@ -232,8 +262,6 @@
232262 void SetupFog(const LPD3DXMATRIX pW);
233263 void ResetRenderStatus();
234264
235- void DumpTextures();
236- void DumpGroups();
237265
238266 /**
239267 * \brief Enable/disable material alpha value for transparency calculation.
@@ -244,34 +272,19 @@
244272 * calculated as the product of material and texture alpha value.
245273 */
246274 inline void EnableMatAlpha (bool enable) { bModulateMatAlpha = enable; }
247-
248- DWORD AddTexture(D3D9ClientSurface *pTex);
249- DWORD AddMaterial(D3D9MatExt *pMat);
250- void SetMeshGroupTextureIdx(DWORD grp, DWORD tex_idx);
251- void SetMeshGroupMaterialIdx(DWORD grp, DWORD mtrl_idx);
252- bool Bake();
253275
254276 private:
255277
256- void Copy(const D3D9Mesh &mesh);
278+ //void Copy(const D3D9Mesh &mesh);
257279 void UpdateTangentSpace(NMVERTEX *pVrt, WORD *pIdx, DWORD nVtx, DWORD nFace, bool bTextured);
258280 void ProcessInherit();
259281 bool CopyVertices(GROUPREC *grp, const MESHGROUPEX *mg, D3DXVECTOR3 *reorig = NULL, float *scale = NULL);
260282 void SetGroupRec(DWORD i, const MESHGROUPEX *mg);
261- void UpdateGeometryBuffer(int grp=-1);
262283 void Null();
263284
264- LPDIRECT3DVERTEXBUFFER9 pVB; ///< (Local) Vertex buffer pointer
265- LPDIRECT3DVERTEXBUFFER9 pGB;
266- LPDIRECT3DINDEXBUFFER9 pIB;
267285
268- D3DXVECTOR3 *pGBSys;
269- WORD *pIBSys;
270-
271286 DWORD MaxVert;
272287 DWORD MaxFace;
273- DWORD Constr;
274-
275288 GROUPREC *Grp; // list of mesh groups
276289 DWORD nGrp; // number of mesh groups
277290 DWORD nMtrl; // number of mesh materials
@@ -290,8 +303,6 @@
290303 _LightList LightList[MAX_SCENE_LIGHTS];
291304 LightStruct *Locals;
292305
293-
294- bool bDynamic; // Mesh is using a dynamic vertex buffer for faster read-modify-write
295306 bool bBSRecompute; // Bounding sphere must be recomputed
296307 bool bBSRecomputeAll;
297308 bool bModulateMatAlpha; // mix material and texture alpha channels
diff -r 1f4979392798 -r e20b4b8a0ac2 Orbitersdk/D3D9Client/MeshMgr.cpp
--- a/Orbitersdk/D3D9Client/MeshMgr.cpp Wed Oct 23 21:44:24 2019 +0000
+++ b/Orbitersdk/D3D9Client/MeshMgr.cpp Tue Nov 05 00:28:42 2019 +0000
@@ -82,25 +82,4 @@
8282 for (i=0;i<nmlist;i++) if (mlist[i].hMesh==hMesh) return mlist[i].mesh;
8383 // Should we store the mesh here ??
8484 return NULL;
85-}
86-
87-void MeshManager::UpdateMesh (MESHHANDLE hMesh)
88-{
89- int i;
90- for (i=0;i<nmlist;i++) if (mlist[i].hMesh==hMesh) {
91- if (mlist[i].mesh) {
92- DWORD ngrp = mlist[i].mesh->GetGroupCount();
93- for (DWORD k=0;k<ngrp;k++) {
94- MESHGROUPEX *mg = oapiMeshGroupEx(hMesh, k);
95- if (mg) mlist[i].mesh->UpdateGroupEx(k, mg);
96- }
97- DWORD nMtrl = oapiMeshMaterialCount(hMesh);
98- for (DWORD k=0;k<nMtrl;k++) {
99- D3D9MatExt meshmat;
100- CreateMatExt((const D3DMATERIAL9 *)oapiMeshMaterial(hMesh, k), &meshmat);
101- mlist[i].mesh->SetMaterial(&meshmat, k);
102- }
103- }
104- break;
105- }
10685 }
\ No newline at end of file
diff -r 1f4979392798 -r e20b4b8a0ac2 Orbitersdk/D3D9Client/MeshMgr.h
--- a/Orbitersdk/D3D9Client/MeshMgr.h Wed Oct 23 21:44:24 2019 +0000
+++ b/Orbitersdk/D3D9Client/MeshMgr.h Tue Nov 05 00:28:42 2019 +0000
@@ -25,7 +25,6 @@
2525 void DeleteAll();
2626 int StoreMesh (MESHHANDLE hMesh, const char *name);
2727 const D3D9Mesh *GetMesh (MESHHANDLE hMesh);
28- void UpdateMesh (MESHHANDLE hMesh);
2928
3029 private:
3130 oapi::D3D9Client *gc;
diff -r 1f4979392798 -r e20b4b8a0ac2 Orbitersdk/D3D9Client/VVessel.cpp
--- a/Orbitersdk/D3D9Client/VVessel.cpp Wed Oct 23 21:44:24 2019 +0000
+++ b/Orbitersdk/D3D9Client/VVessel.cpp Tue Nov 05 00:28:42 2019 +0000
@@ -3,7 +3,7 @@
33 // Part of the ORBITER VISUALISATION PROJECT (OVP)
44 // Dual licensed under GPL v3 and LGPL v3
55 // Copyright (C) 2006-2016 Martin Schweiger
6-// 2010-2016 Jarmo Nikkanen (D3D9Client modification)
6+// 2010-2019 Jarmo Nikkanen (D3D9Client modification)
77 // ==============================================================
88
99 #include <set>
@@ -54,10 +54,9 @@
5454 pMatMgr = new MatMgr(this, scene->GetClient());
5555 for (int i = 0; i < ARRAYSIZE(pEnv); i++) pEnv[i] = NULL;
5656
57- if (strcmp(vessel->GetClassNameA(), "AMSO") == 0) vClass = VCLASS_AMSO;
58- if (strcmp(vessel->GetClassNameA(), "XR2Ravenstar") == 0) vClass = VCLASS_XR2;
59- if (strcmp(vessel->GetClassNameA(), "SpaceShuttleUltra") == 0) vClass = VCLASS_ULTRA;
60- if (strcmp(vessel->GetClassNameA(), "SSU_CentaurGPrime") == 0) vClass = VCLASS_SSU_CENTAUR;
57+ if (strncmp(vessel->GetClassNameA(), "XR2Ravenstar", 12) == 0) vClass = VCLASS_XR2;
58+ if (strncmp(vessel->GetClassNameA(), "SpaceShuttleUltra", 17) == 0) vClass = VCLASS_ULTRA;
59+ if (strncmp(vessel->GetClassNameA(), "SSU_CentaurGPrime", 17) == 0) vClass = VCLASS_SSU_CENTAUR;
6160
6261 bBSRecompute = true;
6362 ExhaustLength = 0.0f;
@@ -238,8 +237,8 @@
238237 bBSRecompute = true;
239238 if (nmesh) DisposeMeshes();
240239
241- MESHHANDLE hMesh;
242- const D3D9Mesh *mesh;
240+ MESHHANDLE hMesh = NULL;
241+ const D3D9Mesh *mesh = NULL;
243242 VECTOR3 ofs;
244243 UINT idx;
245244
@@ -255,20 +254,20 @@
255254 for (idx=0;idx<nmesh;idx++) {
256255
257256 hMesh = vessel->GetMeshTemplate(idx);
258- if (vClass==VCLASS_AMSO) mmgr->UpdateMesh(hMesh);
259257 mesh = mmgr->GetMesh(hMesh);
260258
261- if (hMesh!=NULL && mesh!=NULL) {
259+ if (hMesh && mesh) {
262260 // copy from preloaded template
263- meshlist[idx].mesh = new D3D9Mesh(*mesh);
261+ meshlist[idx].mesh = new D3D9Mesh(hMesh, *mesh); // Create new Instance from an existing mesh template
264262 meshlist[idx].mesh->SetClass(vClass);
265263 }
266264 else {
267- // It's vital to use copy here for some reason
265+ // It's vital to use "CopyMeshFromTemplate" here for some reason
266+ // No global template exists for this mesh. Loaded with oapiLoadMesh()
268267 hMesh = vessel->CopyMeshFromTemplate(idx);
269268 if (hMesh) {
270269 // load on the fly and discard after copying
271- meshlist[idx].mesh = new D3D9Mesh(hMesh, false);
270+ meshlist[idx].mesh = new D3D9Mesh(hMesh); // Create new DX9 Mesh
272271 meshlist[idx].mesh->SetClass(vClass);
273272 oapiDeleteMesh(hMesh);
274273 }
@@ -329,15 +328,13 @@
329328 // now add the new mesh
330329 MeshManager *mmgr = gc->GetMeshMgr();
331330 MESHHANDLE hMesh = vessel->GetMeshTemplate(idx);
332- if (vClass==VCLASS_AMSO) mmgr->UpdateMesh(hMesh);
333331 const D3D9Mesh *mesh = mmgr->GetMesh(hMesh);
334332
335-
336333 if (hMesh && mesh) {
337- meshlist[idx].mesh = new D3D9Mesh (*mesh);
334+ meshlist[idx].mesh = new D3D9Mesh(hMesh, *mesh); // Create new Instance from an existing mesh template
338335 meshlist[idx].mesh->SetClass(vClass);
339- } else if (hMesh = vessel->CopyMeshFromTemplate (idx)) { // It's vital to use a copy here for some reason
340- meshlist[idx].mesh = new D3D9Mesh (hMesh);
336+ } else if (hMesh = vessel->CopyMeshFromTemplate (idx)) {
337+ meshlist[idx].mesh = new D3D9Mesh(hMesh); // Create new DX9 Mesh
341338 meshlist[idx].mesh->SetClass(vClass);
342339 oapiDeleteMesh (hMesh);
343340 } else {
@@ -365,6 +362,7 @@
365362
366363
367364 // ============================================================================================
365+// In response to VESSEL::MeshModified()
368366 //
369367 void vVessel::ResetMesh(UINT idx)
370368 {
@@ -372,26 +370,27 @@
372370
373371 VECTOR3 ofs = _V(0, 0, 0);
374372
375- if (idx < nmesh) {
373+ if ((idx < nmesh) && meshlist[idx].mesh) {
376374
377375 MESHHANDLE hMesh = vessel->GetMeshTemplate(idx);
378376
379377 if (hMesh) {
380-
381378 meshlist[idx].mesh->ReLoadMeshFromHandle(hMesh);
382-
383- pMatMgr->ApplyConfiguration(meshlist[idx].mesh);
379+ meshlist[idx].mesh->ResetTransformations();
380+ }
381+ else {
382+ hMesh = vessel->CopyMeshFromTemplate(idx);
383+ if (hMesh) {
384+ meshlist[idx].mesh->ReLoadMeshFromHandle(hMesh);
385+ meshlist[idx].mesh->ResetTransformations();
386+ oapiDeleteMesh(hMesh);
387+ }
388+ }
384389
385- meshlist[idx].vismode = vessel->GetMeshVisibilityMode(idx);
386- vessel->GetMeshOffset(idx, ofs);
387-
388- if (length(ofs)) {
389- if (!meshlist[idx].trans) meshlist[idx].trans = new D3DXMATRIX;
390- D3DMAT_Identity(meshlist[idx].trans);
391- D3DMAT_SetTranslation(meshlist[idx].trans, &ofs);
392- }
393- else {
394- SAFE_DELETE(meshlist[idx].trans);
390+ for (UINT i = 0; i < nanim; ++i) {
391+ UINT ncomp = anim[i].ncomp;
392+ for (UINT k = 0; k < ncomp; ++k) {
393+ if (anim[i].comp[k]->trans->mesh == idx) animstate[i] = anim[i].defstate; // reset to default animation state
395394 }
396395 }
397396 }
Show on old repository browser