修订版 | 373a3b6398dcc10e88cb034131dd41c945d612ac (tree) |
---|---|
时间 | 2011-06-21 07:00:00 |
作者 | Jarmonik |
Commiter | Jarmonik |
D3D9Client: auto-check for 4xAA capability + 2D Panel performance improvements
@@ -200,8 +200,8 @@ | ||
200 | 200 | MagFilter = LINEAR; |
201 | 201 | MipFilter = NONE; |
202 | 202 | MaxAnisotropy = 2; |
203 | - AddressU = MIRROR; | |
204 | - AddressV = MIRROR; | |
203 | + AddressU = CLAMP; | |
204 | + AddressV = CLAMP; | |
205 | 205 | }; |
206 | 206 | |
207 | 207 | sampler RingS = sampler_state // Planetary rings sampler |
@@ -293,12 +293,12 @@ | ||
293 | 293 | void LegacySunColor(out half4 diff, out float ambi, out float nigh, in float3 normalW) |
294 | 294 | { |
295 | 295 | float h = dot(-gSun.direction, normalW); |
296 | - float3 r0 = 1.0 - float3(0.40f, 0.65f, 1.0f) * gDispersion; | |
296 | + float3 r0 = 1.0 - float3(0.40, 0.65, 1.0) * gDispersion; | |
297 | 297 | |
298 | 298 | if (gDispersion!=0) { // case 1: planet has atmosphere |
299 | 299 | float3 di = (r0 + (1.0-r0) * saturate(h*5.780)) * saturate((h+gSunAppRad)/(2.0*gSunAppRad)); |
300 | 300 | float ni = (h+0.242)*2.924; |
301 | - float am = saturate(gAmbient0*saturate(ni)-0.05 + gGlobalAmb); | |
301 | + float am = saturate(max(gAmbient0*saturate(ni)-0.05, gGlobalAmb)); | |
302 | 302 | |
303 | 303 | diff = float4(di*(1.0-am*0.5),1); |
304 | 304 | ambi = am; |
@@ -306,7 +306,7 @@ | ||
306 | 306 | } |
307 | 307 | else { // case 2: planet has no atmosphere |
308 | 308 | diff = float4(r0*saturate((h+gSunAppRad)/(2.0f*gSunAppRad)), 1); |
309 | - ambi = 0; | |
309 | + ambi = gGlobalAmb; | |
310 | 310 | nigh = 0; |
311 | 311 | } |
312 | 312 | } |
@@ -309,7 +309,7 @@ | ||
309 | 309 | |
310 | 310 | float3 r = reflect(gSun.direction, normalW); |
311 | 311 | float s = pow(max(dot(r, normalize(frg.toCamW)), 0.0f), 20.0f) * (1.0f-dayTex.a); |
312 | - float d = dot(-gSun.direction, normalW); | |
312 | + float d = saturate(dot(-gSun.direction, normalW)*1.5); | |
313 | 313 | //float n = 1.0f; |
314 | 314 | |
315 | 315 | if (d<0) { |
@@ -32,7 +32,7 @@ | ||
32 | 32 | float3 tocam = normalize(-posW); |
33 | 33 | float3 sundir = gSun.direction; |
34 | 34 | |
35 | - float diff = max(dot(-sundir, nrmW), 0.0f); | |
35 | + float diff = saturate(dot(-sundir, nrmW)*1.5); | |
36 | 36 | float dotr = max(dot(reflect(sundir, nrmW), tocam), 0.0f); |
37 | 37 | float spec = pow(diff,0.25f) * pow(dotr, gWater.specPower); |
38 | 38 | float nigh = 0.0f; |
@@ -87,7 +87,7 @@ | ||
87 | 87 | float4 color = tex2D(Planet0S, frg.tex0); |
88 | 88 | |
89 | 89 | if (dot(frg.normalW, frg.toCamW)<0) { // Render cloud layer from below |
90 | - float4 diff = (min(1,frg.aux.g+0.5) * frg.diffuse) * gMat.diffuse + data; | |
90 | + float4 diff = (min(1,frg.aux.g+0.7) * frg.diffuse) * gMat.diffuse + data; | |
91 | 91 | return float4((color.rgb*diff.rgb), color.a*mic); |
92 | 92 | } |
93 | 93 |
@@ -191,27 +191,4 @@ | ||
191 | 191 | ZEnable = false; |
192 | 192 | ZWriteEnable = false; |
193 | 193 | } |
194 | -} | |
195 | - | |
196 | - | |
197 | - | |
198 | -/* | |
199 | -float4 PlanetTechPS(TileVS frg) : COLOR | |
200 | -{ | |
201 | - float diff = max(0.0f, dot(-normalize(gSun.direction), normalize(frg.normalW))); | |
202 | - float4 vDif = diff * (gSun.diffuse) + (gMat.ambient*gSun.ambient) + (gMat.emissive); | |
203 | - float micro = 1.0f; | |
204 | - | |
205 | - if (gMix>0.0f) micro -= tex2D(Planet3S, frg.tex1).a; | |
206 | - | |
207 | - float dotr = max(0.0f, dot(reflect(normalize(gSun.direction), normalize(frg.normalW)), normalize(frg.toCamW))); | |
208 | - | |
209 | - float4 vSpe = (pow(diff,0.5f)*pow(dotr, gWater.specPower)) * (gWater.specular*gSun.specular) * micro; | |
210 | - | |
211 | - if (gSpecMode==2) vSpe *= 1.0f - tex2D(Planet1S, frg.tex0).a; | |
212 | - if (gSpecMode==0) vSpe = 0; | |
213 | - | |
214 | - float4 color = vDif * tex2D(Planet0S, frg.tex0) + frg.aux.a*tex2D(Planet1S, frg.tex0) + vSpe; | |
215 | - | |
216 | - return float4(color.rgb+gColor.rgb, 1.0f); | |
217 | -}*/ | |
\ No newline at end of file | ||
194 | +} | |
\ No newline at end of file |
@@ -37,7 +37,6 @@ | ||
37 | 37 | D3D9Client *g_client = 0; |
38 | 38 | D3D9Catalog *MeshCatalog = 0; |
39 | 39 | |
40 | - | |
41 | 40 | // ============================================================== |
42 | 41 | // API interface |
43 | 42 | // ============================================================== |
@@ -90,6 +89,7 @@ | ||
90 | 89 | |
91 | 90 | D3D9Client::D3D9Client (HINSTANCE hInstance) : ogciClass(hInstance) |
92 | 91 | { |
92 | + hSplashScreen = NULL; | |
93 | 93 | pFramework = NULL; |
94 | 94 | pd3dDevice = NULL; |
95 | 95 | vtab = NULL; |
@@ -155,14 +155,19 @@ | ||
155 | 155 | { |
156 | 156 | _TRACER; |
157 | 157 | |
158 | + hSplashScreen = NULL; | |
158 | 159 | hRenderWnd = NULL; |
159 | 160 | pDefaultTex = NULL; |
160 | 161 | bControlPanel = false; |
162 | + bVisualsCreated = false; | |
161 | 163 | bFullscreen = false; |
162 | 164 | bFailed = false; |
165 | + bRunning = false; | |
163 | 166 | bSkpGDI = true; |
167 | + bSafeStartup = true; | |
164 | 168 | viewW = viewH = 0; |
165 | 169 | viewBPP = 0; |
170 | + uFrameCounter = 0; | |
166 | 171 | scene = NULL; |
167 | 172 | meshmgr = NULL; |
168 | 173 | texmgr = NULL; |
@@ -208,9 +213,11 @@ | ||
208 | 213 | D3D9PadPen::D3D9TechInit(pd3dDevice); |
209 | 214 | D3D9PadBrush::D3D9TechInit(pd3dDevice); |
210 | 215 | D3D9Pad::D3D9TechInit(pd3dDevice); |
216 | + | |
217 | + deffont = (oapi::Font*) new D3D9PadFont(18, true, "fixed"); | |
218 | + defpen = (oapi::Pen*) new D3D9PadPen(1, 1, 0x00FF00); | |
211 | 219 | |
212 | - //ShowDefaultSplash(); // Warning D3D9ClientSurface is not yet fully initialized here | |
213 | - SplashScreen(); | |
220 | + SplashScreen(); // Warning D3D9ClientSurface is not yet fully initialized here | |
214 | 221 | |
215 | 222 | D3D9ClientSurface::D3D9TechInit(pd3dDevice); |
216 | 223 | D3D9Effect::D3D9TechInit(pd3dDevice); |
@@ -247,7 +254,11 @@ | ||
247 | 254 | { |
248 | 255 | _TRACER; |
249 | 256 | LogAlw("================ clbkPostCreation ==============="); |
250 | - if (scene) scene->Initialise(); | |
257 | + | |
258 | + bStartPaused = oapiGetPause(); | |
259 | + | |
260 | + if (scene) scene->Initialise(); // This doesn't do much | |
261 | + | |
251 | 262 | WriteLog("[Scene Initialized]"); |
252 | 263 | } |
253 | 264 |
@@ -263,7 +274,6 @@ | ||
263 | 274 | GraphicsClient::clbkCloseSession(fastclose); |
264 | 275 | SAFE_DELETE(scene); |
265 | 276 | |
266 | - LogAlw("Clearing Garbage Collection"); | |
267 | 277 | WriteLog("[Session Closed. Scene deleted.]"); |
268 | 278 | } |
269 | 279 |
@@ -281,16 +291,27 @@ | ||
281 | 291 | vStar::GlobalExit(); |
282 | 292 | vVessel::GlobalExit(); |
283 | 293 | vObject::GlobalExit(); |
294 | + | |
295 | + delete defpen; | |
296 | + delete deffont; | |
297 | + | |
284 | 298 | D3D9Pad::GlobalExit(); |
285 | 299 | |
286 | 300 | SAFE_DELETE(meshmgr); |
287 | 301 | SAFE_DELETE(texmgr); |
288 | - | |
302 | + SAFE_DELETE(hSplashScreen); | |
303 | + | |
289 | 304 | pFramework->Reset(); |
290 | 305 | |
291 | - pd3dDevice = NULL; | |
292 | - viewW = viewH = viewBPP = 0; | |
293 | - hRenderWnd = NULL; | |
306 | + pd3dDevice = NULL; | |
307 | + hRenderWnd = NULL; | |
308 | + bVisualsCreated = false; | |
309 | + bFailed = false; | |
310 | + bRunning = false; | |
311 | + bSafeStartup = true; | |
312 | + viewW = viewH = 0; | |
313 | + viewBPP = 0; | |
314 | + uFrameCounter = 0; | |
294 | 315 | } |
295 | 316 | |
296 | 317 | // ============================================================== |
@@ -298,9 +319,12 @@ | ||
298 | 319 | void D3D9Client::clbkUpdate(bool running) |
299 | 320 | { |
300 | 321 | _TRACER; |
301 | - if (bFailed==false) { | |
302 | - scene->Update(); | |
303 | - } | |
322 | + if (bFailed==false) scene->Update(); | |
323 | +} | |
324 | + | |
325 | +void D3D9Client::VisualsCreated() | |
326 | +{ | |
327 | + bVisualsCreated = true; | |
304 | 328 | } |
305 | 329 | |
306 | 330 | // ============================================================== |
@@ -317,8 +341,30 @@ | ||
317 | 341 | return; |
318 | 342 | } |
319 | 343 | |
344 | + if (bSafeStartup && !bRunning && !bStartPaused) { | |
345 | + if (oapiGetSimTime()>1.2) oapiSetPause(true); | |
346 | + if (oapiGetSimTime()>1.2) uFrameCounter++; | |
347 | + if (uFrameCounter>10) { | |
348 | + uFrameCounter = 0; | |
349 | + bSafeStartup = false; | |
350 | + } | |
351 | + clbkBlt(NULL, 0, 0, hSplashScreen); | |
352 | + return; | |
353 | + } | |
354 | + | |
320 | 355 | LogOk("== Begin Scene ==========================================================================================================="); |
321 | 356 | |
357 | + scene->UpdateCamVis(); | |
358 | + | |
359 | + if (bVisualsCreated && !bRunning) { | |
360 | + uFrameCounter++; | |
361 | + if (uFrameCounter>5) { | |
362 | + oapiSetPause(bStartPaused); | |
363 | + bVisualsCreated = false; | |
364 | + bRunning = true; | |
365 | + } | |
366 | + } | |
367 | + | |
322 | 368 | bScene = true; |
323 | 369 | scene->Render(); |
324 | 370 | bScene = false; |
@@ -330,19 +376,20 @@ | ||
330 | 376 | |
331 | 377 | RECT rect = {0, viewH-20, viewW, viewH}; |
332 | 378 | pFramework->GetSmallFont()->DrawTextA(0, oapiDebugString(), -1, &rect, DT_LEFT | DT_TOP, D3DCOLOR_XRGB(255, 255, 255)); |
333 | - | |
379 | + | |
334 | 380 | if (oapiGetPause()) { |
381 | + char text[32]; int len; | |
382 | + if (bRunning==true) strcpy_s(text,32,"PAUSED"), len = 6; | |
383 | + else strcpy_s(text,32,"D3D9CLIENT IS STARTING UP"), len = 25; | |
335 | 384 | RECT rect2 = {0,viewH-60,viewW,viewH-20}; |
336 | - pFramework->GetLargeFont()->DrawTextA(0, "PAUSED", 6, &rect2, DT_CENTER | DT_TOP, D3DCOLOR_XRGB(0, 0, 0)); | |
385 | + pFramework->GetLargeFont()->DrawTextA(0, text, len, &rect2, DT_CENTER | DT_TOP, D3DCOLOR_XRGB(0, 0, 0)); | |
337 | 386 | rect2.left-=4; rect2.top-=4; |
338 | - pFramework->GetLargeFont()->DrawTextA(0, "PAUSED", 6, &rect2, DT_CENTER | DT_TOP, D3DCOLOR_XRGB(255, 255, 255)); | |
387 | + pFramework->GetLargeFont()->DrawTextA(0, text, len, &rect2, DT_CENTER | DT_TOP, D3DCOLOR_XRGB(255, 255, 255)); | |
339 | 388 | } |
340 | 389 | |
341 | 390 | bScene = false; |
342 | 391 | HR(pd3dDevice->EndScene()); |
343 | 392 | |
344 | - uFrameCounter++; | |
345 | - | |
346 | 393 | if (bControlPanel) RenderControlPanel(); |
347 | 394 | |
348 | 395 | LogOk("== End Scene =="); |
@@ -360,9 +407,8 @@ | ||
360 | 407 | |
361 | 408 | bool D3D9Client::clbkDisplayFrame() |
362 | 409 | { |
363 | - _TRACER; | |
364 | - if (!RenderWithPopupWindows()) pFramework->ShowFrame(); | |
365 | - LogMsg("...return"); | |
410 | + if (!RenderWithPopupWindows()) pFramework->ShowFrame(); | |
411 | + //else pFramework->ShowFrame(); | |
366 | 412 | return true; |
367 | 413 | } |
368 | 414 |
@@ -605,7 +651,7 @@ | ||
605 | 651 | if (!bFullscreen) return false; // no special treatment required in windowed mode |
606 | 652 | |
607 | 653 | if (count) GetDevice()->SetDialogBoxMode(true); |
608 | - else GetDevice()->SetDialogBoxMode(false); | |
654 | + else GetDevice()->SetDialogBoxMode(false); | |
609 | 655 | |
610 | 656 | return false; |
611 | 657 | } |
@@ -765,8 +811,6 @@ | ||
765 | 811 | |
766 | 812 | if (ngrp==0) return; |
767 | 813 | |
768 | - D3D9Mesh pMesh(this); | |
769 | - | |
770 | 814 | float sx = 1.0f/(float)(T->m11), dx = (float)(T->m13); |
771 | 815 | float sy = 1.0f/(float)(T->m22), dy = (float)(T->m23); |
772 | 816 | float vw = (float)viewW; |
@@ -798,7 +842,7 @@ | ||
798 | 842 | |
799 | 843 | for (unsigned int k=0;k<gr->nVtx;k++) gr->Vtx[k].z = 0.0f; |
800 | 844 | |
801 | - pMesh.Render2DPanel(gr, SURFACE(surf), &ident, alpha, scale); | |
845 | + D3D9Mesh::Render2DPanel(pd3dDevice, gr, SURFACE(surf), &ident, alpha, scale); | |
802 | 846 | } |
803 | 847 | } |
804 | 848 |
@@ -1100,7 +1144,8 @@ | ||
1100 | 1144 | DWORD Width = pFramework->GetRenderWidth(); |
1101 | 1145 | DWORD Height = pFramework->GetRenderHeight(); |
1102 | 1146 | HINSTANCE hInst = oapiGetOrbiterInstance(); |
1103 | - SURFHANDLE hScaled = oapiCreateSurface(Width, Height); | |
1147 | + | |
1148 | + hSplashScreen = SURFACE(oapiCreateSurface(Width, Height)); | |
1104 | 1149 | |
1105 | 1150 | HBITMAP hBM = LoadBitmap(hInst, MAKEINTRESOURCE(273)); |
1106 | 1151 | BITMAP bm; |
@@ -1108,7 +1153,7 @@ | ||
1108 | 1153 | GetObject(hBM, sizeof(BITMAP), &bm); |
1109 | 1154 | |
1110 | 1155 | HDC hSrc = CreateCompatibleDC(NULL); |
1111 | - HDC hDC = SURFACE(hScaled)->GetDCHard(); | |
1156 | + HDC hDC = SURFACE(hSplashScreen)->GetDCHard(); | |
1112 | 1157 | |
1113 | 1158 | HGDIOBJ hOld = SelectObject(hSrc, hBM); |
1114 | 1159 |
@@ -1144,24 +1189,32 @@ | ||
1144 | 1189 | if (m>12) m=0; |
1145 | 1190 | |
1146 | 1191 | char dataA[128]; |
1147 | - sprintf_s(dataA,128,"D3D9Client RC25 Build [%s]",__DATE__); | |
1192 | + sprintf_s(dataA,128,"D3D9Client RC26 Build [%s]",__DATE__); | |
1148 | 1193 | char dataB[128]; |
1149 | 1194 | sprintf_s(dataB,128,"Build %s %u 20%u [%u]", months[m], d, y, oapiGetOrbiterVersion()); |
1150 | 1195 | |
1196 | + char dataC[]={"Warning: Running in GDI compatibility mode. Expect a low framerate."}; | |
1151 | 1197 | int xc = Width*814/bm.bmWidth; |
1152 | 1198 | int yc = Height*544/bm.bmHeight; |
1153 | 1199 | |
1154 | 1200 | TextOut(hDC, xc, yc + 0*20, "ORBITER Space Flight Simulator",30); |
1155 | 1201 | TextOut(hDC, xc, yc + 1*20, dataB, strlen(dataB)); |
1156 | 1202 | TextOut(hDC, xc, yc + 2*20, dataA, strlen(dataA)); |
1203 | + | |
1204 | + if (bGDIBB) { | |
1205 | + SetTextAlign(hDC, TA_CENTER); | |
1206 | + TextOut(hDC, Width/2, Height-30, dataC, strlen(dataC)); | |
1207 | + } | |
1208 | + | |
1157 | 1209 | |
1158 | 1210 | SelectObject(hDC, hO); |
1159 | 1211 | DeleteObject(hF); |
1160 | 1212 | |
1161 | - SURFACE(hScaled)->ReleaseDC(hDC); | |
1213 | + SURFACE(hSplashScreen)->ReleaseDC(hDC); | |
1162 | 1214 | |
1163 | - clbkBlt(NULL, 0, 0, hScaled); | |
1164 | - clbkDisplayFrame(); | |
1215 | + clbkBlt(NULL, 0, 0, hSplashScreen); | |
1216 | + | |
1217 | + pFramework->ShowFrame(); | |
1165 | 1218 | } |
1166 | 1219 | |
1167 | 1220 | #pragma region Drawing_(Sketchpad)_Interface |
@@ -455,6 +455,7 @@ | ||
455 | 455 | void DebugString(const char *format, ...) const; |
456 | 456 | void WriteLog2(const char *format, ...) const; |
457 | 457 | void SplashScreen(); |
458 | + void VisualsCreated(); | |
458 | 459 | |
459 | 460 | const LPD3DXMATRIX GetIdentity() const { return (const LPD3DXMATRIX)&ident; } |
460 | 461 |
@@ -561,6 +562,7 @@ | ||
561 | 562 | LPDIRECT3DDEVICE9 pd3dDevice; |
562 | 563 | LPD3D9CLIENTSURFACE pDefaultTex; |
563 | 564 | LPD3D9CLIENTSURFACE pScatterTest; |
565 | + LPD3D9CLIENTSURFACE hSplashScreen; | |
564 | 566 | |
565 | 567 | SURFHANDLE hTest; |
566 | 568 |
@@ -572,13 +574,17 @@ | ||
572 | 574 | bool bScatterUpdate; |
573 | 575 | bool bSkpGDI; |
574 | 576 | bool bFullscreen; // fullscreen render mode flag |
575 | - bool bGDIBB; // use stencil buffers | |
577 | + bool bGDIBB; | |
576 | 578 | bool bFailed; |
577 | 579 | bool bScene; |
580 | + bool bStartPaused; | |
581 | + bool bVisualsCreated; | |
582 | + bool bSafeStartup; | |
583 | + bool bRunning; | |
578 | 584 | |
579 | 585 | DWORD viewW, viewH; // dimensions of the render viewport |
580 | 586 | DWORD viewBPP; // bit depth of render viewport |
581 | - | |
587 | + | |
582 | 588 | // device enumeration callback function |
583 | 589 | |
584 | 590 | VideoTab *vtab; // video selection user interface |
@@ -62,9 +62,10 @@ | ||
62 | 62 | pItemsSkp = oapiGetSketchpad(GetBackBufferHandle()); |
63 | 63 | |
64 | 64 | oapi::Pen * pen = oapiCreatePen(1, 10, 0xFFFF00); |
65 | + oapi::Pen * nullp = oapiCreatePen(0, 1, 0xFFFFFF); | |
65 | 66 | oapi::Brush *brush = oapiCreateBrush(0xA0000000); |
66 | 67 | |
67 | - pItemsSkp->SetPen(NULL); | |
68 | + pItemsSkp->SetPen(nullp); | |
68 | 69 | pItemsSkp->SetBrush(brush); |
69 | 70 | |
70 | 71 | pItemsSkp->Rectangle(0, 0, viewW, viewH); |
@@ -16,10 +16,8 @@ | ||
16 | 16 | |
17 | 17 | using namespace oapi; |
18 | 18 | |
19 | -IDirect3DVertexDeclaration9 *pPatchVertexDecl = NULL; | |
20 | 19 | IDirect3DVertexDeclaration9 *pHazeVertexDecl = NULL; |
21 | 20 | IDirect3DVertexDeclaration9 *pNTVertexDecl = NULL; |
22 | -IDirect3DVertexDeclaration9 *pAdVertexDecl = NULL; | |
23 | 21 | IDirect3DVertexDeclaration9 *pPosColorDecl = NULL; |
24 | 22 | IDirect3DVertexDeclaration9 *pPositionDecl = NULL; |
25 | 23 | IDirect3DVertexDeclaration9 *pVector4Decl = NULL; |
@@ -97,10 +95,8 @@ | ||
97 | 95 | SAFE_RELEASE(pLargeFont); |
98 | 96 | SAFE_RELEASE(pSmallFont); |
99 | 97 | |
100 | - SAFE_RELEASE(pPatchVertexDecl); | |
101 | 98 | SAFE_RELEASE(pHazeVertexDecl); |
102 | 99 | SAFE_RELEASE(pNTVertexDecl); |
103 | - SAFE_RELEASE(pAdVertexDecl); | |
104 | 100 | SAFE_RELEASE(pPosColorDecl); |
105 | 101 | SAFE_RELEASE(pPositionDecl); |
106 | 102 | SAFE_RELEASE(pPosTexDecl); |
@@ -171,7 +167,12 @@ | ||
171 | 167 | |
172 | 168 | // Hardware CAPS Checks -------------------------------------------------- |
173 | 169 | // |
174 | - HR(pD3D->GetDeviceCaps(Adapter, D3DDEVTYPE_HAL, &caps)); | |
170 | + HRESULT hr = pD3D->GetDeviceCaps(Adapter, D3DDEVTYPE_HAL, &caps); | |
171 | + | |
172 | + if (hr!=S_OK) { | |
173 | + LogErr("pD3D->GetDeviceCaps(Adapter, D3DDEVTYPE_HAL, &caps)"); | |
174 | + return hr; | |
175 | + } | |
175 | 176 | |
176 | 177 | LogAlw("MaxTextureBlendStages..: %u",caps.MaxTextureBlendStages); |
177 | 178 | LogAlw("MaxTextureWidth........: %u",caps.MaxTextureWidth); |
@@ -244,8 +245,6 @@ | ||
244 | 245 | return -1; |
245 | 246 | } |
246 | 247 | |
247 | - HRESULT hr = NULL; | |
248 | - | |
249 | 248 | if (bIsFullscreen) hr = CreateFullscreenMode(); |
250 | 249 | else hr = CreateWindowedMode(); |
251 | 250 |
@@ -266,12 +265,10 @@ | ||
266 | 265 | } |
267 | 266 | |
268 | 267 | HR(pd3dDevice->CreateVertexDeclaration(NTVertexDecl, &pNTVertexDecl)); |
269 | - HR(pd3dDevice->CreateVertexDeclaration(AdVertexDecl, &pAdVertexDecl)); | |
270 | 268 | HR(pd3dDevice->CreateVertexDeclaration(PosColorDecl, &pPosColorDecl)); |
271 | 269 | HR(pd3dDevice->CreateVertexDeclaration(PositionDecl, &pPositionDecl)); |
272 | 270 | HR(pd3dDevice->CreateVertexDeclaration(Vector4Decl, &pVector4Decl)); |
273 | 271 | HR(pd3dDevice->CreateVertexDeclaration(PosTexDecl, &pPosTexDecl)); |
274 | - HR(pd3dDevice->CreateVertexDeclaration(PatchVertexDecl, &pPatchVertexDecl)); | |
275 | 272 | HR(pd3dDevice->CreateVertexDeclaration(HazeVertexDecl, &pHazeVertexDecl)); |
276 | 273 | |
277 | 274 | // Setup some default fomts |
@@ -19,8 +19,14 @@ | ||
19 | 19 | HFONT hFont; |
20 | 20 | } fcache[128]; |
21 | 21 | |
22 | + | |
22 | 23 | int nfcache = 0; |
24 | +int pens_allocated = 0; | |
25 | +int brushes_allocated = 0; | |
26 | +int fonts_allocated = 0; | |
23 | 27 | |
28 | +oapi::Font * deffont = 0; | |
29 | +oapi::Pen * defpen = 0; | |
24 | 30 | |
25 | 31 | // ====================================================================== |
26 | 32 | // class GDIPad |
@@ -64,6 +70,7 @@ | ||
64 | 70 | } |
65 | 71 | |
66 | 72 | cfont = deffont; |
73 | + cpen = defpen; | |
67 | 74 | } |
68 | 75 | |
69 | 76 |
@@ -72,13 +79,16 @@ | ||
72 | 79 | _TRACE; |
73 | 80 | if (pTgt) if (pTgt->IsBackBuffer()==false) pTgt->ReleaseGPU(); |
74 | 81 | pTgt = NULL; |
82 | + | |
83 | + //if (cfont!=deffont && cfont!=NULL) LogWrn("Custom font still attached in sketchpad 0x%X",this); | |
84 | + //if (cpen!=defpen && cpen!=NULL) LogWrn("Custom pen still attached in sketchpad 0x%X",this); | |
85 | + //if (cbrush!=NULL) LogWrn("Custom brush still attached in sketchpad 0x%X",this); | |
86 | + | |
75 | 87 | LogOk("...D3D9 SketchPad Released"); |
76 | 88 | } |
77 | 89 | |
78 | - | |
79 | 90 | Font *D3D9Pad::SetFont(Font *font) const |
80 | 91 | { |
81 | - _TRACE; | |
82 | 92 | Font *pfont = cfont; |
83 | 93 | if (font) cfont = font; |
84 | 94 | else cfont = deffont; |
@@ -88,9 +98,9 @@ | ||
88 | 98 | Pen *D3D9Pad::SetPen (Pen *pen) const |
89 | 99 | { |
90 | 100 | Pen *ppen = cpen; |
91 | - cpen = pen; | |
92 | - if (pen) pencolor = ((D3D9PadPen *)pen)->fcolor; | |
93 | - else pencolor = D3DXCOLOR(DWORD(0)); | |
101 | + if (pen) cpen = pen; | |
102 | + else cpen = NULL; | |
103 | + if (cpen) pencolor = ((D3D9PadPen *)cpen)->fcolor; | |
94 | 104 | return ppen; |
95 | 105 | } |
96 | 106 |
@@ -165,6 +175,25 @@ | ||
165 | 175 | origy = y; |
166 | 176 | } |
167 | 177 | |
178 | +bool D3D9Pad::HasPen() | |
179 | +{ | |
180 | + if (cpen==NULL) return false; | |
181 | + if (((D3D9PadPen*)cpen)->style==PS_NULL) return false; | |
182 | + return true; | |
183 | +} | |
184 | + | |
185 | +bool D3D9Pad::HasWidePen() | |
186 | +{ | |
187 | + if (cpen==NULL) return false; | |
188 | + if (((D3D9PadPen*)cpen)->width>1) return true; | |
189 | + return false; | |
190 | +} | |
191 | + | |
192 | +bool D3D9Pad::HasBrush() | |
193 | +{ | |
194 | + return (cbrush != NULL); | |
195 | +} | |
196 | + | |
168 | 197 | bool D3D9Pad::Text (int x, int y, const char *str, int len) |
169 | 198 | { |
170 | 199 | D3D9Text *pText = ((D3D9PadFont *)cfont)->pFont; |
@@ -201,7 +230,7 @@ | ||
201 | 230 | |
202 | 231 | void D3D9Pad::LineTo (int x, int y) |
203 | 232 | { |
204 | - if (cpen==NULL) return; | |
233 | + if (!HasPen()) return; | |
205 | 234 | D3DXVECTOR3 pts[2]; |
206 | 235 | pts[0] = D3DXVECTOR3(float(cx), float(cy), 0.0f); |
207 | 236 | pts[1] = D3DXVECTOR3(float(origx+x), float(origy+y), 0.0f); |
@@ -211,7 +240,7 @@ | ||
211 | 240 | |
212 | 241 | void D3D9Pad::Line (int x0, int y0, int x1, int y1) |
213 | 242 | { |
214 | - if (cpen==NULL) return; | |
243 | + if (!HasPen()) return; | |
215 | 244 | x0+=origx; y0+=origy; |
216 | 245 | x1+=origx; y1+=origy; |
217 | 246 | D3DXVECTOR3 pts[2]; |
@@ -225,14 +254,9 @@ | ||
225 | 254 | { |
226 | 255 | l+=origx; t+=origy; |
227 | 256 | r+=origx; b+=origy; |
228 | - | |
229 | 257 | D3D9PadPen * pen = (D3D9PadPen*)cpen; |
230 | - | |
231 | - if (pen==NULL) Rectangle2(float(l+r)*0.5f, float(t+b)*0.5f, float(r-l), float(b-t)); | |
232 | - else { | |
233 | - if (pen->width==1) Rectangle2(float(l+r)*0.5f, float(t+b)*0.5f, float(r-l), float(b-t)); | |
234 | - else Rectangle3(float(l+r)*0.5f, float(t+b)*0.5f, float(r-l), float(b-t), pen->width); | |
235 | - } | |
258 | + if (HasWidePen()) Rectangle3(float(l+r)*0.5f, float(t+b)*0.5f, float(r-l), float(b-t), pen->width); | |
259 | + else Rectangle2(float(l+r)*0.5f, float(t+b)*0.5f, float(r-l), float(b-t)); | |
236 | 260 | } |
237 | 261 | |
238 | 262 | void D3D9Pad::Ellipse (int l, int t, int r, int b) |
@@ -251,13 +275,6 @@ | ||
251 | 275 | { |
252 | 276 | if (cpen==NULL) return; |
253 | 277 | LogErr("D3D9SketchPad: Polyline not implemented"); |
254 | - /* | |
255 | - D3DXVECTOR3 *pVert = new D3DXVECTOR3[(npt-1)*2]; | |
256 | - | |
257 | - for (int i=0;i<npt;i++) { | |
258 | - pVert[i].x = pt[i].x, pVert[i].y = pt[i].y, pVert[i].z = 0.5f; | |
259 | - } | |
260 | - */ | |
261 | 278 | } |
262 | 279 | |
263 | 280 | // ----------------------------------------------------------------------------------------------- |
@@ -283,7 +300,7 @@ | ||
283 | 300 | D3DXVECTOR4 data(x, y, w*0.5f, h*0.5f); |
284 | 301 | HR(pDev->SetVertexDeclaration(pPositionDecl)); |
285 | 302 | |
286 | - if (w<24 && h<24) pDev->SetStreamSource(0, pCircleLow, 0, sizeof(D3DXVECTOR3)); | |
303 | + if (w<32 && h<32) pDev->SetStreamSource(0, pCircleLow, 0, sizeof(D3DXVECTOR3)); | |
287 | 304 | else pDev->SetStreamSource(0, pCircleHigh, 0, sizeof(D3DXVECTOR3)); |
288 | 305 | |
289 | 306 | FX->SetTechnique(eDraw); |
@@ -292,14 +309,14 @@ | ||
292 | 309 | FX->Begin(&numPasses, D3DXFX_DONOTSAVESTATE); |
293 | 310 | FX->BeginPass(0); |
294 | 311 | |
295 | - if (cbrush) { | |
296 | - if (w<24 && h<24) pDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 15); | |
312 | + if (HasBrush()) { | |
313 | + if (w<32 && h<32) pDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 15); | |
297 | 314 | else pDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 63); |
298 | 315 | } |
299 | - if (cpen) { | |
316 | + if (HasPen()) { | |
300 | 317 | FX->SetValue(eColor, &pencolor, sizeof(D3DXCOLOR)); |
301 | 318 | FX->CommitChanges(); |
302 | - if (w<24 && h<24) pDev->DrawPrimitive(D3DPT_LINESTRIP, 1, 15); | |
319 | + if (w<32 && h<32) pDev->DrawPrimitive(D3DPT_LINESTRIP, 1, 15); | |
303 | 320 | else pDev->DrawPrimitive(D3DPT_LINESTRIP, 1, 63); |
304 | 321 | } |
305 | 322 | FX->EndPass(); |
@@ -329,10 +346,10 @@ | ||
329 | 346 | |
330 | 347 | FX->Begin(&numPasses, D3DXFX_DONOTSAVESTATE); |
331 | 348 | FX->BeginPass(0); |
332 | - if (cbrush) { | |
349 | + if (HasBrush()) { | |
333 | 350 | pDev->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, &indices, D3DFMT_INDEX16, &verts, sizeof(D3DXVECTOR3)); |
334 | 351 | } |
335 | - if (cpen) { | |
352 | + if (HasPen()) { | |
336 | 353 | FX->SetValue(eColor, &pencolor, sizeof(D3DXCOLOR)); |
337 | 354 | FX->CommitChanges(); |
338 | 355 | pDev->DrawPrimitiveUP(D3DPT_LINESTRIP, 4, &verts, sizeof(D3DXVECTOR3)); |
@@ -373,10 +390,10 @@ | ||
373 | 390 | FX->Begin(&numPasses, D3DXFX_DONOTSAVESTATE); |
374 | 391 | FX->BeginPass(0); |
375 | 392 | |
376 | - if (cbrush) { | |
393 | + if (HasBrush()) { | |
377 | 394 | pDev->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 8, 2, &f_indices, D3DFMT_INDEX16, &verts, sizeof(D3DXVECTOR3)); |
378 | 395 | } |
379 | - if (cpen) { | |
396 | + if (HasPen()) { | |
380 | 397 | FX->SetValue(eColor, &pencolor, sizeof(D3DXCOLOR)); |
381 | 398 | FX->CommitChanges(); |
382 | 399 | pDev->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 8, 8, &o_indices, D3DFMT_INDEX16, &verts, sizeof(D3DXVECTOR3)); |
@@ -390,13 +407,18 @@ | ||
390 | 407 | // |
391 | 408 | void D3D9Pad::GlobalExit() |
392 | 409 | { |
393 | - if (deffont) delete deffont; | |
394 | - deffont = NULL; | |
410 | + | |
411 | + if (pens_allocated!=0) LogErr("SketchPad Pens still in use %d",pens_allocated); | |
412 | + if (brushes_allocated!=0) LogErr("SketchPad Brushes still in use %d",brushes_allocated); | |
413 | + if (fonts_allocated!=0) LogErr("SketchPad Fonts still in use %d",fonts_allocated); | |
414 | + | |
415 | + if (pens_allocated==0 && brushes_allocated==0 && fonts_allocated==0) LogAlw("Sketchap Exiting... All resources released"); | |
395 | 416 | |
396 | 417 | for (int i=0;i<nfcache;i++) { |
397 | 418 | if (fcache[i].pFont) delete fcache[i].pFont; |
398 | 419 | if (fcache[i].hFont) DeleteObject(fcache[i].hFont); |
399 | 420 | } |
421 | + | |
400 | 422 | memset(fcache, 0, 128*sizeof(FontCache)); |
401 | 423 | } |
402 | 424 |
@@ -405,13 +427,10 @@ | ||
405 | 427 | // |
406 | 428 | void D3D9Pad::D3D9TechInit(LPDIRECT3DDEVICE9 pDevice) |
407 | 429 | { |
408 | - | |
409 | 430 | memset(fcache, 0, 128*sizeof(FontCache)); |
410 | 431 | |
411 | 432 | pDev = pDevice; |
412 | 433 | |
413 | - deffont = (oapi::Font*) new D3D9PadFont(18, true, "fixed"); | |
414 | - | |
415 | 434 | // Initialize Ellipses ------------------------------------------------------------------------- |
416 | 435 | // |
417 | 436 | HR(pDev->CreateVertexBuffer(17*sizeof(D3DXVECTOR3), 0, 0, D3DPOOL_DEFAULT, &pCircleLow, NULL)); |
@@ -492,8 +511,6 @@ | ||
492 | 511 | LPDIRECT3DVERTEXBUFFER9 D3D9Pad::pCircleLow = 0; |
493 | 512 | LPDIRECT3DVERTEXBUFFER9 D3D9Pad::pCircleHigh = 0; |
494 | 513 | LPDIRECT3DVERTEXBUFFER9 D3D9Pad::pRect = 0; |
495 | -oapi::Font * D3D9Pad::deffont = 0; | |
496 | - | |
497 | 514 | LPDIRECT3DDEVICE9 D3D9PadFont::pDev = 0; |
498 | 515 | LPDIRECT3DDEVICE9 D3D9PadPen::pDev = 0; |
499 | 516 | LPDIRECT3DDEVICE9 D3D9PadBrush::pDev = 0; |
@@ -509,6 +526,8 @@ | ||
509 | 526 | |
510 | 527 | D3D9PadFont::D3D9PadFont(int height, bool prop, const char *face, Style style, int orientation) : oapi::Font (height, prop, face, style, orientation) |
511 | 528 | { |
529 | + fonts_allocated++; | |
530 | + | |
512 | 531 | char *def_fixedface = "Courier New"; |
513 | 532 | char *def_sansface = "Arial"; |
514 | 533 | char *def_serifface = "Times New Roman"; |
@@ -596,8 +615,8 @@ | ||
596 | 615 | |
597 | 616 | D3D9PadFont::~D3D9PadFont () |
598 | 617 | { |
599 | - //if (bDelete) DeleteObject(hFont); // Delete only rotated GDI fonts | |
600 | - if (hFont && bDelete) DeleteObject(hFont); | |
618 | + fonts_allocated--; | |
619 | + if (hFont && bDelete) DeleteObject(hFont); // Delete rotated (non-cached) fonts | |
601 | 620 | } |
602 | 621 | |
603 | 622 | void D3D9PadFont::D3D9TechInit(LPDIRECT3DDEVICE9 pDevice) |
@@ -612,6 +631,8 @@ | ||
612 | 631 | |
613 | 632 | D3D9PadPen::D3D9PadPen (int s, int w, DWORD col): oapi::Pen (style, width, col) |
614 | 633 | { |
634 | + pens_allocated++; | |
635 | + | |
615 | 636 | switch (s) { |
616 | 637 | case 0: style = PS_NULL; break; |
617 | 638 | case 2: style = PS_DOT; break; |
@@ -627,6 +648,7 @@ | ||
627 | 648 | |
628 | 649 | D3D9PadPen::~D3D9PadPen () |
629 | 650 | { |
651 | + pens_allocated--; | |
630 | 652 | DeleteObject(hPen); |
631 | 653 | } |
632 | 654 |
@@ -635,12 +657,14 @@ | ||
635 | 657 | pDev = pDevice; |
636 | 658 | } |
637 | 659 | |
660 | + | |
638 | 661 | // ====================================================================== |
639 | 662 | // class GDIBrush |
640 | 663 | // ====================================================================== |
641 | 664 | |
642 | 665 | D3D9PadBrush::D3D9PadBrush (DWORD col): oapi::Brush (col) |
643 | 666 | { |
667 | + brushes_allocated++; | |
644 | 668 | if ((col&0xFF000000)==0) col|=0xFF000000; |
645 | 669 | fcolor = D3DXCOLOR(col); |
646 | 670 | D3DXCOLORSWAP(&fcolor); |
@@ -649,6 +673,7 @@ | ||
649 | 673 | |
650 | 674 | D3D9PadBrush::~D3D9PadBrush () |
651 | 675 | { |
676 | + brushes_allocated--; | |
652 | 677 | DeleteObject(hBrush); |
653 | 678 | } |
654 | 679 |
@@ -15,6 +15,8 @@ | ||
15 | 15 | * DirectX calls. |
16 | 16 | */ |
17 | 17 | |
18 | +extern oapi::Font *deffont; | |
19 | +extern oapi::Pen *defpen; | |
18 | 20 | |
19 | 21 | class D3D9Pad: public oapi::Sketchpad { |
20 | 22 |
@@ -56,6 +58,10 @@ | ||
56 | 58 | |
57 | 59 | private: |
58 | 60 | |
61 | + bool HasPen(); | |
62 | + bool HasBrush(); | |
63 | + bool HasWidePen(); | |
64 | + | |
59 | 65 | void Ellipse2( float x, float y, float w, float h); |
60 | 66 | void Rectangle2(float x, float y, float w, float h); |
61 | 67 | void Rectangle3(float x, float y, float w, float h, int width); |
@@ -78,7 +84,6 @@ | ||
78 | 84 | |
79 | 85 | D3D9ClientSurface *pTgt; |
80 | 86 | |
81 | - static oapi::Font *deffont; | |
82 | 87 | static LPDIRECT3DDEVICE9 pDev; |
83 | 88 | static LPDIRECT3DVERTEXBUFFER9 pCircleLow; |
84 | 89 | static LPDIRECT3DVERTEXBUFFER9 pCircleHigh; |
@@ -1173,6 +1173,7 @@ | ||
1173 | 1173 | // |
1174 | 1174 | void D3D9ClientSurface::SetColorKey(DWORD ck) |
1175 | 1175 | { |
1176 | + /* | |
1176 | 1177 | if (ck=='BEGN') { |
1177 | 1178 | LogErr("Begin Blit Group"); |
1178 | 1179 | if (Type!=D3D9S_RTGTTEX) ConvertToRenderTargetTexture(); |
@@ -1197,9 +1198,9 @@ | ||
1197 | 1198 | ReleaseGPU(); |
1198 | 1199 | bBlitGroup = false; |
1199 | 1200 | return; |
1200 | - } | |
1201 | + }*/ | |
1201 | 1202 | |
1202 | - if (ck==0) ck=0xFF000000; | |
1203 | + //if (ck==0) ck=0xFF000000; | |
1203 | 1204 | ColorKey = ck; |
1204 | 1205 | ClrKey = D3DXCOLOR(ColorKey); |
1205 | 1206 | } |
@@ -47,11 +47,11 @@ | ||
47 | 47 | if (atm) { // case 1: planet has atmosphere |
48 | 48 | lcol = (r0 + (_one-r0) * saturate(h/d)) * saturate((h+rs)/(2.0f*rs)); |
49 | 49 | amb = saturate((h+ae)/aq); |
50 | - amb = saturate(amb0*amb-0.05f+ao); | |
50 | + amb = saturate(max(amb0*amb-0.05f,ao)); | |
51 | 51 | lcol *= 1.0f-amb*0.5f; // reduce direct light component to avoid overexposure |
52 | 52 | } |
53 | 53 | else { // case 2: planet has no atmosphere |
54 | - lcol = r0 * saturate((h-rs)/(2.0f*rs)); | |
54 | + lcol = r0 * saturate((h+rs)/(2.0f*rs)); | |
55 | 55 | amb = ao; |
56 | 56 | lcol *= 1.0f-amb*0.5f; // reduce direct light component to avoid overexposure |
57 | 57 | } |
@@ -79,64 +79,63 @@ | ||
79 | 79 | |
80 | 80 | VECTOR3 S = GS-GO; // sun's position from base |
81 | 81 | VECTOR3 P = GO-GP; |
82 | - | |
82 | + | |
83 | + double r = length(P); | |
84 | + double s = length(S); | |
83 | 85 | double pres = 1.0; |
84 | 86 | double size = oapiGetSize(hP); |
85 | 87 | double grav = oapiGetMass(hP) * 6.67259e-11 / (size*size); |
86 | 88 | |
87 | - double aalt = 1.0; | |
88 | - double amb0 = 0.0; | |
89 | - double disp = 0.0; | |
90 | - double amb = 0.0; | |
91 | - double aq = 0.342; | |
92 | - double ae = 0.242; | |
93 | - double al = 0.0; | |
89 | + float aalt = 1.0f; | |
90 | + float amb0 = 0.0f; | |
91 | + float disp = 0.0f; | |
92 | + float amb = 0.0f; | |
93 | + float aq = 0.342f; | |
94 | + float ae = 0.242f; | |
95 | + float al = 0.0f; | |
96 | + float k = float(sqrt(r*r-size*size)); // HOrizon distance | |
97 | + float alt = float(r-size); | |
98 | + float rs = float(oapiGetSize(hS) / s); | |
99 | + float ac = float(-dotp(S,P)/(r*s)); // sun elevation | |
94 | 100 | |
95 | - double r = length(P); | |
96 | - double s = length(S); // sun's distance | |
97 | - double k = sqrt(r*r-size*size); // HOrizon distance | |
98 | - double alt = r-size; | |
99 | - double rs = oapiGetSize(hS) / s; | |
100 | - double ac = -dotp(S,P)/(r*s); // sun elevation | |
101 | + if (ac>1.0f) ac=1.0f; if (ac<-1.0f) ac=-1.0f; | |
101 | 102 | |
102 | - if (ac>1.0) ac=1.0; if (ac<-1.0) ac=-1.0; | |
103 | - | |
104 | - ac = acos(ac) - asin(size/r); | |
103 | + ac = acos(ac) - asin(float(size/r)); | |
105 | 104 | |
106 | - if (ac>1.39) ac = 1.39; | |
107 | - if (ac<-1.39) ac = -1.39; | |
105 | + if (ac>1.39f) ac = 1.39f; | |
106 | + if (ac<-1.39f) ac = -1.39f; | |
108 | 107 | |
109 | - double h = tan(ac); | |
108 | + float h = tan(ac); | |
110 | 109 | |
111 | 110 | const ATMCONST *atm = (oapiGetObjectType(hP)==OBJTP_PLANET ? oapiGetPlanetAtmConstants (hP) : NULL); |
112 | 111 | |
113 | 112 | if (atm) { |
114 | - aalt = atm->p0 * log(atm->p0/pres) / (atm->rho0*grav); | |
115 | - amb0 = min (0.7f, log(float(atm->rho0)+1.0f)*0.4f); | |
116 | - disp = max (0.02f, min(0.9f, log(float(atm->rho0)+1.0f))); | |
113 | + aalt = float(atm->p0 * log(atm->p0/pres) / (atm->rho0*grav)); | |
114 | + amb0 = float(min (0.7, log(atm->rho0+1.0f)*0.4)); | |
115 | + disp = float(max (0.02, min(0.9, log(atm->rho0+1.0)))); | |
117 | 116 | } |
118 | 117 | |
119 | - if (alt>10e3) al = aalt / k; | |
120 | - else al = 0.173; | |
118 | + if (alt>10e3f) al = aalt / k; | |
119 | + else al = 0.173f; | |
121 | 120 | |
122 | 121 | D3DXVECTOR3 lcol(1,1,1); |
123 | - D3DXVECTOR3 r0 = _one - D3DXVECTOR3(0.45f, 0.75f, 1.0f) * (float)disp; | |
122 | + D3DXVECTOR3 r0 = _one - D3DXVECTOR3(0.45f, 0.75f, 1.0f) * disp; | |
124 | 123 | |
125 | 124 | if (atm) { |
126 | - lcol = (r0 + (_one-r0) * saturate((float)(h/al))) * saturate(float((h+rs)/(2.0f*rs))); | |
127 | - amb = amb0 / (alt*0.5e-4 + 1.0); | |
128 | - amb = saturate((float)amb*saturate((float)((h+ae)/aq)-0.05f+ao)); | |
129 | - lcol *= 1.0f-(float)amb*0.5f; // reduce direct light component to avoid overexposure | |
125 | + lcol = (r0 + (_one-r0) * saturate((h/al))) * saturate((h+rs)/(2.0f*rs)); | |
126 | + amb = amb0 / (alt*0.5e-4f + 1.0f); | |
127 | + amb = saturate(max(amb*saturate(((h+ae)/aq)-0.05f), ao)); | |
128 | + lcol *= 1.0f-amb*0.5f; // reduce direct light component to avoid overexposure | |
130 | 129 | } |
131 | 130 | else { |
132 | - lcol = (r0 * saturate((float)((h+rs)/(2.0f*rs)))); | |
131 | + lcol = r0 * saturate((h+rs)/(2.0f*rs)); | |
133 | 132 | amb = ao; |
134 | - lcol *= 1.0f-(float)amb*0.5f; // reduce direct light component to avoid overexposure | |
133 | + lcol *= 1.0f-amb*0.5f; // reduce direct light component to avoid overexposure | |
135 | 134 | } |
136 | 135 | |
137 | 136 | light->Diffuse = light->Specular = D3DXCOLOR(lcol.x, lcol.y, lcol.z, 1.0f); |
138 | - light->Ambient = D3DXCOLOR((float)amb, (float)amb, (float)amb, 1.0f); | |
139 | - light->Direction = D3DXVECTOR3(float(S.x), float(S.y), float(S.z)) * (-1.0f/(float)s); | |
137 | + light->Ambient = D3DXCOLOR(amb, amb, amb, 1.0f); | |
138 | + light->Direction = D3DXVECTOR3(float(S.x), float(S.y), float(S.z)) * (-1.0f/float(s)); | |
140 | 139 | } |
141 | 140 | |
142 | 141 |
@@ -64,14 +64,6 @@ | ||
64 | 64 | D3DDECL_END() |
65 | 65 | }; |
66 | 66 | |
67 | -const D3DVERTEXELEMENT9 AdVertexDecl[] = { | |
68 | - {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, | |
69 | - {0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0}, | |
70 | - {0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0}, | |
71 | - {0, 32, D3DDECLTYPE_UBYTE4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0}, | |
72 | - D3DDECL_END() | |
73 | -}; | |
74 | - | |
75 | 67 | const D3DVERTEXELEMENT9 PatchVertexDecl[] = { |
76 | 68 | {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, |
77 | 69 | {0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0}, |
@@ -113,18 +105,6 @@ | ||
113 | 105 | float x; ///< vertex x position |
114 | 106 | float y; ///< vertex y position |
115 | 107 | float z; ///< vertex z position |
116 | - float nx; ///< vertex x normal | |
117 | - float ny; ///< vertex y normal | |
118 | - float nz; ///< vertex z normal | |
119 | - float tu; ///< vertex u texture coordinate | |
120 | - float tv; ///< vertex v texture coordinate | |
121 | - int idx; ///< blend index | |
122 | -} ADVERTEX; | |
123 | - | |
124 | -typedef struct { | |
125 | - float x; ///< vertex x position | |
126 | - float y; ///< vertex y position | |
127 | - float z; ///< vertex z position | |
128 | 108 | float tu; ///< vertex u texture coordinate |
129 | 109 | float tv; ///< vertex v texture coordinate |
130 | 110 | } SMVERTEX; |
@@ -146,10 +126,8 @@ | ||
146 | 126 | #define D3D9LTheta 2 |
147 | 127 | #define D3D9LPhi 3 |
148 | 128 | |
149 | -extern IDirect3DVertexDeclaration9 *pPatchVertexDecl; | |
150 | 129 | extern IDirect3DVertexDeclaration9 *pHazeVertexDecl; |
151 | 130 | extern IDirect3DVertexDeclaration9 *pNTVertexDecl; |
152 | -extern IDirect3DVertexDeclaration9 *pAdVertexDecl; | |
153 | 131 | extern IDirect3DVertexDeclaration9 *pPosColorDecl; |
154 | 132 | extern IDirect3DVertexDeclaration9 *pPositionDecl; |
155 | 133 | extern IDirect3DVertexDeclaration9 *pPosTexDecl; |
@@ -17,10 +17,9 @@ | ||
17 | 17 | { |
18 | 18 | LogOk("Creating GDI SketchPad..."); |
19 | 19 | |
20 | - hDC = hdc; | |
21 | - hFont0 = NULL; | |
22 | - cfont = NULL; | |
23 | - cpen = NULL; | |
20 | + hDC = hdc; | |
21 | + cfont = deffont; | |
22 | + cpen = NULL; //defpen; | |
24 | 23 | cbrush = NULL; |
25 | 24 | |
26 | 25 | //LogAlw("Creating a GDI Sketchpad for surface 0x%X",s); |
@@ -28,57 +27,47 @@ | ||
28 | 27 | // Default initial drawing settings |
29 | 28 | SetBkMode (hDC, TRANSPARENT); // transparent text background |
30 | 29 | |
31 | - if (cfont) hFont0 = (HFONT)SelectObject(hDC, ((D3D9PadFont*)cfont)->hFont); | |
30 | + if (cfont) SelectObject(hDC, ((D3D9PadFont*)cfont)->hFont); | |
31 | + | |
32 | + if (cpen) SelectObject(hDC, ((D3D9PadPen*)cpen)->hPen); | |
33 | + else SelectObject(hDC, GetStockObject (NULL_PEN)); | |
34 | + | |
32 | 35 | SelectObject (hDC, GetStockObject (NULL_BRUSH)); // no fill |
33 | - SelectObject (hDC, GetStockObject (NULL_PEN)); // no outline | |
34 | 36 | } |
35 | 37 | |
36 | 38 | GDIPad::~GDIPad () |
37 | 39 | { |
38 | - //LogAlw("[CLOSED] GDI Sketchpad"); | |
39 | 40 | // make sure to deselect custom resources before destroying the DC |
40 | - if (hFont0) SelectObject (hDC, hFont0); | |
41 | - if (cpen) SelectObject (hDC, GetStockObject (NULL_PEN)); | |
42 | - if (cbrush) SelectObject (hDC, GetStockObject (NULL_BRUSH)); | |
43 | - | |
41 | + SelectObject (hDC, GetStockObject (NULL_PEN)); | |
42 | + SelectObject (hDC, GetStockObject (NULL_BRUSH)); | |
44 | 43 | LogOk("...GDI SketchPad Released"); |
45 | 44 | } |
46 | 45 | |
47 | 46 | Font *GDIPad::SetFont (Font *font) const |
48 | 47 | { |
49 | 48 | Font *pfont = cfont; |
50 | - if (font) { | |
51 | - HFONT hFont = (HFONT)SelectObject (hDC, ((D3D9PadFont*)font)->hFont); | |
52 | - if (!cfont) hFont0 = hFont; | |
53 | - } else if (hFont0) { // restore original font | |
54 | - SelectObject (hDC, hFont0); | |
55 | - hFont0 = 0; | |
56 | - } | |
57 | - cfont = font; | |
49 | + if (font) cfont = font; | |
50 | + else cfont = deffont; | |
51 | + SelectObject(hDC, ((D3D9PadFont*)cfont)->hFont); | |
58 | 52 | return pfont; |
59 | 53 | } |
60 | 54 | |
61 | 55 | Pen *GDIPad::SetPen (Pen *pen) const |
62 | 56 | { |
63 | 57 | Pen *ppen = cpen; |
64 | - if (pen) { | |
65 | - SelectObject (hDC, ((D3D9PadPen*)pen)->hPen); | |
66 | - } else { // disable outlines | |
67 | - SelectObject (hDC, GetStockObject (NULL_PEN)); | |
68 | - } | |
69 | - cpen = pen; | |
58 | + if (pen) cpen = pen; | |
59 | + else cpen = NULL; | |
60 | + if (cpen) SelectObject (hDC, ((D3D9PadPen*)cpen)->hPen); | |
61 | + else SelectObject (hDC, GetStockObject (NULL_BRUSH)); | |
70 | 62 | return ppen; |
71 | 63 | } |
72 | 64 | |
73 | 65 | Brush *GDIPad::SetBrush (Brush *brush) const |
74 | 66 | { |
75 | 67 | Brush *pbrush = cbrush; |
76 | - if (brush) { | |
77 | - SelectObject (hDC, ((D3D9PadBrush*)brush)->hBrush); | |
78 | - } else { // disable filled brush | |
79 | - SelectObject (hDC, GetStockObject (NULL_BRUSH)); | |
80 | - } | |
81 | 68 | cbrush = brush; |
69 | + if (brush) SelectObject (hDC, ((D3D9PadBrush*)cbrush)->hBrush); | |
70 | + else SelectObject (hDC, GetStockObject (NULL_BRUSH)); | |
82 | 71 | return pbrush; |
83 | 72 | } |
84 | 73 |
@@ -8,9 +8,11 @@ | ||
8 | 8 | |
9 | 9 | FILE *d3d9client_log = NULL; |
10 | 10 | |
11 | +#define LOG_MAX_LINES 250000 | |
11 | 12 | #define ERRBUF 8096 |
12 | 13 | #define OPRBUF 512 |
13 | 14 | #define TIMEBUF 63 |
15 | + | |
14 | 16 | char ErrBuf[ERRBUF+1]; |
15 | 17 | char OprBuf[OPRBUF+1]; |
16 | 18 | char TimeBuf[TIMEBUF+1]; |
@@ -62,20 +64,11 @@ | ||
62 | 64 | |
63 | 65 | char *my_ctime(const time_t *t) |
64 | 66 | { |
65 | - //if (ctime_s(TimeBuf, TIMEBUF, t)) strcpy_s(TimeBuf, TIMEBUF, "Error"); | |
66 | 67 | __int64 qpcCurrent; |
67 | 68 | QueryPerformanceCounter((LARGE_INTEGER*)&qpcCurrent); |
68 | 69 | double time = double(qpcCurrent-qpcRef) * 1e6 / double(qpcFrq); |
69 | 70 | double timet = double(qpcCurrent-qpcStart) / double(qpcFrq); |
70 | 71 | sprintf_s(OprBuf,OPRBUF,"%d: %.2fs %.0fus",iLine, timet, time); iLine++; |
71 | - | |
72 | - /* | |
73 | - for (int i=0;i<=OPRBUF;i++) { | |
74 | - char c = OprBuf[i]; | |
75 | - if (c==13 || c==10 || c==0) { OprBuf[i]=0; return OprBuf; } | |
76 | - } | |
77 | - LogErr("Logging Failed"); | |
78 | - */ | |
79 | 72 | return OprBuf; |
80 | 73 | } |
81 | 74 |
@@ -84,6 +77,7 @@ | ||
84 | 77 | void LogMsg(const char *format, ...) |
85 | 78 | { |
86 | 79 | if (d3d9client_log==NULL) return; |
80 | + if (iLine>LOG_MAX_LINES) return; | |
87 | 81 | if (uEnableLog>3) { |
88 | 82 | DWORD th = GetCurrentThreadId(); |
89 | 83 | time(<ime); |
@@ -93,8 +87,7 @@ | ||
93 | 87 | va_start(args, format); |
94 | 88 | |
95 | 89 | _vsnprintf_s(ErrBuf, ERRBUF, ERRBUF, format, args); |
96 | - //va_end(args); | |
97 | - | |
90 | + | |
98 | 91 | fputs(ErrBuf,d3d9client_log); |
99 | 92 | fputs("<br>\n",d3d9client_log); |
100 | 93 | fflush(d3d9client_log); |
@@ -106,6 +99,7 @@ | ||
106 | 99 | void LogAlw(const char *format, ...) |
107 | 100 | { |
108 | 101 | if (d3d9client_log==NULL) return; |
102 | + if (iLine>LOG_MAX_LINES) return; | |
109 | 103 | if (uEnableLog>0) { |
110 | 104 | DWORD th = GetCurrentThreadId(); |
111 | 105 | time(<ime); |
@@ -115,8 +109,7 @@ | ||
115 | 109 | va_start(args, format); |
116 | 110 | |
117 | 111 | _vsnprintf_s(ErrBuf, ERRBUF, ERRBUF, format, args); |
118 | - //va_end(args); | |
119 | - | |
112 | + | |
120 | 113 | fputs(ErrBuf,d3d9client_log); |
121 | 114 | fputs("</font><br>\n",d3d9client_log); |
122 | 115 | fflush(d3d9client_log); |
@@ -129,6 +122,7 @@ | ||
129 | 122 | void LogErr(const char *format, ...) |
130 | 123 | { |
131 | 124 | if (d3d9client_log==NULL) return; |
125 | + if (iLine>LOG_MAX_LINES) return; | |
132 | 126 | if (uEnableLog>0) { |
133 | 127 | DWORD th = GetCurrentThreadId(); |
134 | 128 | time(<ime); |
@@ -138,8 +132,7 @@ | ||
138 | 132 | va_start(args, format); |
139 | 133 | |
140 | 134 | _vsnprintf_s(ErrBuf, ERRBUF, ERRBUF, format, args); |
141 | - //va_end(args); | |
142 | - | |
135 | + | |
143 | 136 | fputs(ErrBuf,d3d9client_log); |
144 | 137 | fputs("</font><br>\n",d3d9client_log); |
145 | 138 | fflush(d3d9client_log); |
@@ -151,6 +144,7 @@ | ||
151 | 144 | void LogBlu(const char *format, ...) |
152 | 145 | { |
153 | 146 | if (d3d9client_log==NULL) return; |
147 | + if (iLine>LOG_MAX_LINES) return; | |
154 | 148 | if (uEnableLog>1) { |
155 | 149 | DWORD th = GetCurrentThreadId(); |
156 | 150 | time(<ime); |
@@ -160,8 +154,7 @@ | ||
160 | 154 | va_start(args, format); |
161 | 155 | |
162 | 156 | _vsnprintf_s(ErrBuf, ERRBUF, ERRBUF, format, args); |
163 | - //va_end(args); | |
164 | - | |
157 | + | |
165 | 158 | fputs(ErrBuf,d3d9client_log); |
166 | 159 | fputs("</font><br>\n",d3d9client_log); |
167 | 160 | fflush(d3d9client_log); |
@@ -173,6 +166,7 @@ | ||
173 | 166 | void LogWrn(const char *format, ...) |
174 | 167 | { |
175 | 168 | if (d3d9client_log==NULL) return; |
169 | + if (iLine>LOG_MAX_LINES) return; | |
176 | 170 | if (uEnableLog>1) { |
177 | 171 | DWORD th = GetCurrentThreadId(); |
178 | 172 | time(<ime); |
@@ -182,7 +176,6 @@ | ||
182 | 176 | va_start(args, format); |
183 | 177 | |
184 | 178 | _vsnprintf_s(ErrBuf, ERRBUF, ERRBUF, format, args); |
185 | - //va_end(args); | |
186 | 179 | |
187 | 180 | fputs(ErrBuf,d3d9client_log); |
188 | 181 | fputs("</font><br>\n",d3d9client_log); |
@@ -195,6 +188,7 @@ | ||
195 | 188 | void LogOk(const char *format, ...) |
196 | 189 | { |
197 | 190 | if (d3d9client_log==NULL) return; |
191 | + if (iLine>LOG_MAX_LINES) return; | |
198 | 192 | if (uEnableLog>2) { |
199 | 193 | DWORD th = GetCurrentThreadId(); |
200 | 194 | time(<ime); |
@@ -204,8 +198,7 @@ | ||
204 | 198 | va_start(args, format); |
205 | 199 | |
206 | 200 | _vsnprintf_s(ErrBuf, ERRBUF, ERRBUF, format, args); |
207 | - //va_end(args); | |
208 | - | |
201 | + | |
209 | 202 | fputs(ErrBuf,d3d9client_log); |
210 | 203 | fputs("</font><br>\n",d3d9client_log); |
211 | 204 | fflush(d3d9client_log); |
@@ -369,8 +369,8 @@ | ||
369 | 369 | void D3D9Mesh::ProcessInherit() |
370 | 370 | { |
371 | 371 | if (!pVB) return; |
372 | - if (Grp[0]->MtrlIdx == SPEC_INHERIT) { LogWrn("Material SPEC_INHERIT in MesgGroup[0], Mesh=0x%X",this); Grp[0]->MtrlIdx = SPEC_DEFAULT; } | |
373 | - if (Grp[0]->TexIdx == SPEC_INHERIT) { LogWrn("Texture SPEC_INHERIT in MeshGroup[0], Mesh=0x%X",this); Grp[0]->TexIdx = SPEC_DEFAULT; } | |
372 | + if (Grp[0]->MtrlIdx == SPEC_INHERIT) Grp[0]->MtrlIdx = SPEC_DEFAULT; | |
373 | + if (Grp[0]->TexIdx == SPEC_INHERIT) Grp[0]->TexIdx = SPEC_DEFAULT; | |
374 | 374 | |
375 | 375 | for (DWORD i=0;i<nGrp;i++) { |
376 | 376 |
@@ -1268,7 +1268,7 @@ | ||
1268 | 1268 | |
1269 | 1269 | // =========================================================================================== |
1270 | 1270 | // |
1271 | -void D3D9Mesh::Render2DPanel(const MESHGROUP *mg, const LPD3D9CLIENTSURFACE pTex, const LPD3DXMATRIX pW, float alpha, float scale) | |
1271 | +void D3D9Mesh::Render2DPanel(LPDIRECT3DDEVICE9 dev, const MESHGROUP *mg, const LPD3D9CLIENTSURFACE pTex, const LPD3DXMATRIX pW, float alpha, float scale) | |
1272 | 1272 | { |
1273 | 1273 | UINT numPasses = 0; |
1274 | 1274 |
@@ -1287,11 +1287,11 @@ | ||
1287 | 1287 | HR(FX->Begin(&numPasses, D3DXFX_DONOTSAVESTATE)); |
1288 | 1288 | HR(FX->BeginPass(0)); |
1289 | 1289 | |
1290 | - if (alpha<0.5f) gc->GetDevice()->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); | |
1291 | - else gc->GetDevice()->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); | |
1290 | + if (alpha<0.5f) dev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); | |
1291 | + else dev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); | |
1292 | 1292 | |
1293 | - gc->GetDevice()->SetVertexDeclaration(pNTVertexDecl); | |
1294 | - gc->GetDevice()->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, mg->nVtx, mg->nIdx/3, mg->Idx, D3DFMT_INDEX16, mg->Vtx, sizeof(NTVERTEX)); | |
1293 | + dev->SetVertexDeclaration(pNTVertexDecl); | |
1294 | + dev->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, mg->nVtx, mg->nIdx/3, mg->Idx, D3DFMT_INDEX16, mg->Vtx, sizeof(NTVERTEX)); | |
1295 | 1295 | |
1296 | 1296 | HR(FX->EndPass()); |
1297 | 1297 | HR(FX->End()); |
@@ -1301,19 +1301,8 @@ | ||
1301 | 1301 | |
1302 | 1302 | void D3D9Mesh::RenderReEntry(LPDIRECT3DDEVICE9 dev, const LPD3D9CLIENTSURFACE pTex, const LPD3DXVECTOR3 vPosA, const LPD3DXVECTOR3 vPosB, const LPD3DXVECTOR3 vDir, float alpha_a, float alpha_b, float size) |
1303 | 1303 | { |
1304 | - /* | |
1305 | - static float period = 35.0f; | |
1306 | - static double check = 0.0f; | |
1307 | - | |
1308 | - if (oapiGetSimTime()>check) { | |
1309 | - double rnd = oapiRand()*0.25 + 0.75; | |
1310 | - check = oapiGetSimTime() + rnd; | |
1311 | - period = (8.0f*6.283185f) / float(rnd); | |
1312 | - }*/ | |
1313 | - | |
1314 | - static WORD ReentryIdxA[6] = {0,1,2, 3,2,1}; | |
1315 | - static WORD ReentryIdxB[6] = {0,1,2, 3,2,1}; | |
1316 | - | |
1304 | + static WORD ReentryIdx[6] = {0,1,2, 3,2,1}; | |
1305 | + | |
1317 | 1306 | static NTVERTEX ReentryVtxB[4] = { |
1318 | 1307 | {0,-1,-1, 0,0,0, 0.51f, 0.01f}, |
1319 | 1308 | {0,-1, 1, 0,0,0, 0.99f, 0.01f}, |
@@ -1321,12 +1310,12 @@ | ||
1321 | 1310 | {0, 1, 1, 0,0,0, 0.99f, 0.49f} |
1322 | 1311 | }; |
1323 | 1312 | |
1324 | - float x = (5.5f+sin(fmod(float(oapiGetSimTime())*60.0f, 6.283185f))) * 0.7f; | |
1313 | + float x = 4.5f + sin(fmod(float(oapiGetSimTime())*60.0f, 6.283185f)) * 0.5f; | |
1325 | 1314 | |
1326 | 1315 | NTVERTEX ReentryVtxA[4] = { |
1327 | - {0, 1, 1, 0,0,0, 0.49f, 0.01f}, | |
1316 | + {0, 1, 1, 0,0,0, 0.49f, 0.01f}, | |
1328 | 1317 | {0, 1,-x, 0,0,0, 0.49f, 0.99f}, |
1329 | - {0,-1, 1, 0,0,0, 0.01f, 0.01f}, | |
1318 | + {0,-1, 1, 0,0,0, 0.01f, 0.01f}, | |
1330 | 1319 | {0,-1,-x, 0,0,0, 0.01f, 0.99f}, |
1331 | 1320 | }; |
1332 | 1321 |
@@ -1334,7 +1323,7 @@ | ||
1334 | 1323 | D3DXMATRIX WA, WB; |
1335 | 1324 | D3DXVECTOR3 vCam; |
1336 | 1325 | D3DXVec3Normalize(&vCam, vPosA); |
1337 | - D3DMAT_CreateX_Billboard(&vCam, vPosB, size*(1.0f+x*0.1), &WB); | |
1326 | + D3DMAT_CreateX_Billboard(&vCam, vPosB, size*(0.8f+x*0.02f), &WB); | |
1338 | 1327 | D3DMAT_CreateX_Billboard(&vCam, vPosA, vDir, size, size, &WA); |
1339 | 1328 | |
1340 | 1329 | dev->SetVertexDeclaration(pNTVertexDecl); |
@@ -1346,11 +1335,11 @@ | ||
1346 | 1335 | FX->Begin(&numPasses, D3DXFX_DONOTSAVESTATE); |
1347 | 1336 | FX->BeginPass(0); |
1348 | 1337 | |
1349 | - dev->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, &ReentryIdxB, D3DFMT_INDEX16, &ReentryVtxB, sizeof(NTVERTEX)); | |
1338 | + dev->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, &ReentryIdx, D3DFMT_INDEX16, &ReentryVtxB, sizeof(NTVERTEX)); | |
1350 | 1339 | FX->SetFloat(eMix, alpha_a); |
1351 | 1340 | FX->SetMatrix(eW, &WA); |
1352 | 1341 | FX->CommitChanges(); |
1353 | - dev->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, &ReentryIdxA, D3DFMT_INDEX16, &ReentryVtxA, sizeof(NTVERTEX)); | |
1342 | + dev->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, &ReentryIdx, D3DFMT_INDEX16, &ReentryVtxA, sizeof(NTVERTEX)); | |
1354 | 1343 | |
1355 | 1344 | FX->EndPass(); |
1356 | 1345 | FX->End(); |
@@ -1399,6 +1388,7 @@ | ||
1399 | 1388 | void D3D9Mesh::TransformGroup(DWORD n, const D3DXMATRIX *m) |
1400 | 1389 | { |
1401 | 1390 | if (!pVB) return; |
1391 | + | |
1402 | 1392 | bBSRecompute = true; |
1403 | 1393 | Grp[n]->bTransform = true; |
1404 | 1394 | Grp[n]->Transform = Grp[n]->Transform * (*m); |
@@ -1410,6 +1400,7 @@ | ||
1410 | 1400 | void D3D9Mesh::Transform(const D3DXMATRIX *m) |
1411 | 1401 | { |
1412 | 1402 | if (!pVB) return; |
1403 | + | |
1413 | 1404 | bBSRecompute = true; |
1414 | 1405 | bGlobalTF = true; |
1415 | 1406 | mTransform = mTransform * (*m); |
@@ -130,7 +130,8 @@ | ||
130 | 130 | void RenderExhaust(LPDIRECT3DDEVICE9 dev, float alpha, const LPD3DXMATRIX pW, LPD3D9CLIENTSURFACE pTex); |
131 | 131 | void RenderBaseTile(LPDIRECT3DDEVICE9 dev, const LPD3DXMATRIX pW, LPD3D9CLIENTSURFACE pTex); |
132 | 132 | void RenderSpot(LPDIRECT3DDEVICE9 dev, float intens, const LPD3DXCOLOR color, const LPD3DXMATRIX pW, LPD3D9CLIENTSURFACE pTex); |
133 | - void Render2DPanel(const MESHGROUP *mg, const LPD3D9CLIENTSURFACE pTex, const LPD3DXMATRIX pW, float alpha, float scale); | |
133 | + | |
134 | + static void Render2DPanel(LPDIRECT3DDEVICE9 dev, const MESHGROUP *mg, const LPD3D9CLIENTSURFACE pTex, const LPD3DXMATRIX pW, float alpha, float scale); | |
134 | 135 | static void RenderReEntry(LPDIRECT3DDEVICE9 dev, const LPD3D9CLIENTSURFACE pTex, const LPD3DXVECTOR3 vPosA, const LPD3DXVECTOR3 vPosB, const LPD3DXVECTOR3 vDir, float alpha_a, float alpha_b, float size); |
135 | 136 | |
136 | 137 | void Render(LPDIRECT3DDEVICE9 dev, const LPD3DXMATRIX pW, int iTech=0); |
@@ -108,6 +108,8 @@ | ||
108 | 108 | delete []pstream; |
109 | 109 | } |
110 | 110 | |
111 | + DeleteAllVisuals(); | |
112 | + | |
111 | 113 | ExitGDIResources(); |
112 | 114 | } |
113 | 115 |
@@ -180,7 +182,6 @@ | ||
180 | 182 | void Scene::DelVisualRec (VOBJREC *pv) |
181 | 183 | { |
182 | 184 | _TRACE; |
183 | - LogAlw("DelVisualRec"); | |
184 | 185 | // unlink the entry |
185 | 186 | if (pv->prev) pv->prev->next = pv->next; |
186 | 187 | else vobjFirst = pv->next; |
@@ -194,6 +195,23 @@ | ||
194 | 195 | delete pv; |
195 | 196 | } |
196 | 197 | |
198 | + | |
199 | +void Scene::DeleteAllVisuals() | |
200 | +{ | |
201 | + _TRACE; | |
202 | + VOBJREC *pv = vobjFirst; | |
203 | + while (pv) { | |
204 | + VOBJREC *pvn = pv->next; | |
205 | + gc->UnregisterVisObject(pv->vobj->GetObject()); | |
206 | + LogAlw("Deleting Visual 0x%X",pv->vobj); | |
207 | + delete pv->vobj; | |
208 | + delete pv; | |
209 | + pv = pvn; | |
210 | + } | |
211 | + vobjFirst = vobjLast = NULL; | |
212 | +} | |
213 | + | |
214 | + | |
197 | 215 | Scene::VOBJREC *Scene::AddVisualRec(OBJHANDLE hObj) |
198 | 216 | { |
199 | 217 | _TRACER; |
@@ -218,8 +236,7 @@ | ||
218 | 236 | |
219 | 237 | LogAlw("RegisteringVisual (%s) hVessel=0x%X, hObj=0x%X, Vis=0x%X, Rec=0x%X, Type=%d", buf, hVes, hObj, pv->vobj, pv, pv->type); |
220 | 238 | gc->RegisterVisObject(hObj, (VISHANDLE)pv->vobj); |
221 | - LogMsg("Visual Registered succesfully"); | |
222 | - | |
239 | + | |
223 | 240 | return pv; |
224 | 241 | } |
225 | 242 |
@@ -261,7 +278,10 @@ | ||
261 | 278 | // check object visibility (one object per frame in the interest |
262 | 279 | // of scalability) |
263 | 280 | DWORD nobj = oapiGetObjectCount(); |
264 | - if (iVCheck >= nobj) iVCheck = 0; | |
281 | + if (iVCheck >= nobj) { | |
282 | + iVCheck = 0; | |
283 | + gc->VisualsCreated(); | |
284 | + } | |
265 | 285 | OBJHANDLE hObj = oapiGetObjectByIndex(iVCheck++); |
266 | 286 | |
267 | 287 | CheckVisual(hObj); |
@@ -377,8 +397,6 @@ | ||
377 | 397 | { |
378 | 398 | _TRACE; |
379 | 399 | |
380 | - UpdateCamVis(); | |
381 | - | |
382 | 400 | D3DXCOLOR yellow(1.0f, 1.0f, 0.0f, 1.0f); |
383 | 401 | |
384 | 402 | VOBJREC *pv = NULL; |
@@ -808,6 +826,8 @@ | ||
808 | 826 | } |
809 | 827 | } |
810 | 828 | |
829 | + pSketch->SetFont(NULL); | |
830 | + pSketch->SetPen(NULL); | |
811 | 831 | |
812 | 832 | oapiReleaseSketchpad(pSketch); |
813 | 833 |
@@ -66,6 +66,7 @@ | ||
66 | 66 | inline const DWORD ViewH() const { return viewH; } |
67 | 67 | // return viewport dimensions |
68 | 68 | |
69 | + void UpdateCamVis(); | |
69 | 70 | void CheckVisual (OBJHANDLE hObj); |
70 | 71 | // checks if hObj is within visual range, and creates or |
71 | 72 | // deletes the associated vObject as required. |
@@ -166,6 +167,7 @@ | ||
166 | 167 | // NULL if not found |
167 | 168 | |
168 | 169 | void DelVisualRec (VOBJREC *pv); |
170 | + void DeleteAllVisuals(); | |
169 | 171 | // Delete entry pv from the list of visuals |
170 | 172 | |
171 | 173 | VOBJREC *AddVisualRec (OBJHANDLE hObj); |
@@ -177,7 +179,7 @@ | ||
177 | 179 | void InitGDIResources(); |
178 | 180 | void ExitGDIResources(); |
179 | 181 | |
180 | - void UpdateCamVis(); | |
182 | + | |
181 | 183 | |
182 | 184 | |
183 | 185 | // Scene variables ================================================================ |
@@ -58,6 +58,9 @@ | ||
58 | 58 | maxlvl = maxbaselvl = 0; |
59 | 59 | microtex = 0; |
60 | 60 | microlvl = 0.0; |
61 | + tiledesc = NULL; | |
62 | + texbuf = NULL; | |
63 | + specbuf = NULL; | |
61 | 64 | cAmbient = 0; |
62 | 65 | bPreloadTile = cfg->PlanetPreloadMode; |
63 | 66 | if (bPreloadTile) LogAlw("PreLoad Highres textures"); |
@@ -69,20 +72,20 @@ | ||
69 | 72 | { |
70 | 73 | DWORD i, maxidx = patchidx[maxbaselvl]; |
71 | 74 | |
72 | - if (ntex) { | |
75 | + if (ntex && texbuf) { | |
73 | 76 | for (i = 0; i < ntex; i++) |
74 | 77 | texbuf[i]->Release(); |
75 | 78 | delete []texbuf; |
76 | 79 | } |
77 | - if (nmask) { | |
80 | + if (nmask && specbuf) { | |
78 | 81 | for (i = 0; i < nmask; i++) |
79 | 82 | specbuf[i]->Release(); |
80 | 83 | delete []specbuf; |
81 | 84 | } |
82 | 85 | |
83 | - delete tilebuf; | |
84 | - delete []tiledesc; | |
85 | - delete []objname; | |
86 | + //delete tilebuf; // This is static resource created in GlobalInit | |
87 | + if (tiledesc) delete []tiledesc; | |
88 | + if (objname) delete []objname; | |
86 | 89 | } |
87 | 90 | |
88 | 91 | // ======================================================================= |
@@ -200,7 +200,7 @@ | ||
200 | 200 | D3DXMATRIX W; |
201 | 201 | D3DXVECTOR3 vCam; |
202 | 202 | D3DXVECTOR3 vPos(float(cpos.x), float(cpos.y), float(cpos.z)); |
203 | - vPos*=ds; | |
203 | + vPos*=float(ds); | |
204 | 204 | |
205 | 205 | D3DXVec3Normalize(&vCam, &vPos); |
206 | 206 | D3DMAT_CreateX_Billboard(&vCam, &vPos, size, &W); |
@@ -100,7 +100,7 @@ | ||
100 | 100 | for (DWORD i=0;i<nbase;i++) vbase[i] = NULL; |
101 | 101 | |
102 | 102 | |
103 | - if (gc->Cfg()->PreLBaseVis) { | |
103 | + if (gc->Cfg()->PreLBaseVis && _hObj==oapiGetFocusInterface()->GetSurfaceRef()) { | |
104 | 104 | LogAlw("PreLoading Base Visuals"); |
105 | 105 | for (DWORD i=0;i<nbase;i++) { |
106 | 106 | OBJHANDLE hBase = oapiGetBaseByIndex (_hObj, i); |
@@ -112,7 +112,7 @@ | ||
112 | 112 | case EVENT_VESSEL_MESHVISMODE: |
113 | 113 | { |
114 | 114 | //LogBlu("EVENT_VESSEL_MESHVISMODE"); |
115 | - LogAlw("VisMode set to 0x%hX",vessel->GetMeshVisibilityMode(context)); | |
115 | + //LogAlw("VisMode set to 0x%hX",vessel->GetMeshVisibilityMode(context)); | |
116 | 116 | if (context < nmesh) meshlist[context].vismode = vessel->GetMeshVisibilityMode(context); |
117 | 117 | } break; |
118 | 118 |
@@ -381,6 +381,9 @@ | ||
381 | 381 | void vVessel::UpdateAnimations (UINT mshidx) |
382 | 382 | { |
383 | 383 | double newstate; |
384 | + | |
385 | + nanim = vessel->GetAnimPtr(&anim); | |
386 | + | |
384 | 387 | for (UINT i = 0; i < nanim; i++) { |
385 | 388 | if (!anim[i].ncomp) continue; |
386 | 389 | if (animstate[i] != (newstate = anim[i].state)) { |
@@ -845,7 +848,7 @@ | ||
845 | 848 | void vVessel::AnimateComponent (ANIMATIONCOMP *comp, const D3DXMATRIX &T) |
846 | 849 | { |
847 | 850 | UINT i; |
848 | - | |
851 | + | |
849 | 852 | bBSRecompute = true; |
850 | 853 | |
851 | 854 | MGROUP_TRANSFORM *trans = comp->trans; |
@@ -962,13 +965,13 @@ | ||
962 | 965 | vessel->GlobalRot(d, d); |
963 | 966 | normalise(d); |
964 | 967 | |
965 | - float x = dotp(d, unit(cpos)); | |
968 | + float x = float(dotp(d, unit(cpos))); | |
966 | 969 | if (x<0) x=-x; x=pow(x,0.3f); |
967 | 970 | |
968 | - float alpha_B = (x*0.45f + 0.40f) * ints; | |
969 | - float alpha_A = (1.0f - x*0.50) * ints * 1.2f; | |
971 | + float alpha_B = (x*0.40f + 0.60f) * ints; | |
972 | + float alpha_A = (1.0f - x*0.50f) * ints * 1.2f; | |
970 | 973 | |
971 | - float size = vessel->GetSize()*1.7f; | |
974 | + float size = float(vessel->GetSize()) * 1.7f; | |
972 | 975 | |
973 | 976 | D3DXVECTOR3 vPosA(float(cpos.x), float(cpos.y), float(cpos.z)); |
974 | 977 | D3DXVECTOR3 vDir(float(d.x), float(d.y), float(d.z)); |
@@ -1,113 +0,0 @@ | ||
1 | -//Microsoft Developer Studio generated resource script. | |
2 | -// | |
3 | -#include "VideoTabRS.h" | |
4 | - | |
5 | -#define APSTUDIO_READONLY_SYMBOLS | |
6 | -///////////////////////////////////////////////////////////////////////////// | |
7 | -// | |
8 | -// Generated from the TEXTINCLUDE 2 resource. | |
9 | -// | |
10 | -#include "afxres.h" | |
11 | - | |
12 | -///////////////////////////////////////////////////////////////////////////// | |
13 | -#undef APSTUDIO_READONLY_SYMBOLS | |
14 | - | |
15 | -///////////////////////////////////////////////////////////////////////////// | |
16 | -// Finnish resources | |
17 | - | |
18 | -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FIN) | |
19 | -#ifdef _WIN32 | |
20 | -LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT | |
21 | -#pragma code_page(1252) | |
22 | -#endif //_WIN32 | |
23 | - | |
24 | -///////////////////////////////////////////////////////////////////////////// | |
25 | -// | |
26 | -// Dialog | |
27 | -// | |
28 | - | |
29 | -IDD_VIDEOTAB DIALOG DISCARDABLE 0, 0, 345, 210 | |
30 | -STYLE WS_CHILD | WS_BORDER | |
31 | -FONT 8, "MS Sans Serif" | |
32 | -BEGIN | |
33 | - GROUPBOX "3D Adapter",IDC_ADAPTERFRAME,15,7,310,36 | |
34 | - GROUPBOX "",IDC_FRAME1,15,50,149,152 | |
35 | - GROUPBOX "",IDC_FRAME2,177,50,149,152 | |
36 | - PUSHBUTTON "Fullscreen",IDC_FULLSCREEN,29,63,115,14 | |
37 | - PUSHBUTTON "Windowed",IDC_WINDOWED,193,63,115,14 | |
38 | - EDITTEXT IDC_WIDTH,195,97,48,12,ES_AUTOHSCROLL | |
39 | - EDITTEXT IDC_HEIGHT,255,97,50,12,ES_AUTOHSCROLL | |
40 | - LTEXT "Width",IDC_STATIC2X,195,85,48,10 | |
41 | - LTEXT "Height",IDC_STATIC3X,255,85,48,10 | |
42 | - COMBOBOX IDC_ASPECT,195,130,110,15,CBS_DROPDOWN | CBS_SORT | | |
43 | - WS_VSCROLL | WS_TABSTOP | |
44 | - LTEXT "Aspect ration",IDC_STATIC1X,195,118,42,10 | |
45 | - COMBOBOX IDC_RESOLUTION,30,97,115,12,CBS_DROPDOWN | CBS_SORT | | |
46 | - WS_VSCROLL | WS_TABSTOP | |
47 | - LTEXT "Video Resolution",IDC_STATIC4X,30,85,55,10 | |
48 | - CONTROL "V.Sync On",IDC_VSYNC,"Button",BS_AUTOCHECKBOX | | |
49 | - WS_TABSTOP,30,120,105,10 | |
50 | - COMBOBOX IDC_ADAPTER,27,21,284,14,CBS_DROPDOWN | CBS_SORT | | |
51 | - WS_VSCROLL | WS_TABSTOP | |
52 | -END | |
53 | - | |
54 | - | |
55 | -///////////////////////////////////////////////////////////////////////////// | |
56 | -// | |
57 | -// DESIGNINFO | |
58 | -// | |
59 | - | |
60 | -#ifdef APSTUDIO_INVOKED | |
61 | -GUIDELINES DESIGNINFO DISCARDABLE | |
62 | -BEGIN | |
63 | - IDD_VIDEOTAB, DIALOG | |
64 | - BEGIN | |
65 | - LEFTMARGIN, 7 | |
66 | - RIGHTMARGIN, 338 | |
67 | - TOPMARGIN, 7 | |
68 | - BOTTOMMARGIN, 203 | |
69 | - END | |
70 | -END | |
71 | -#endif // APSTUDIO_INVOKED | |
72 | - | |
73 | - | |
74 | -#ifdef APSTUDIO_INVOKED | |
75 | -///////////////////////////////////////////////////////////////////////////// | |
76 | -// | |
77 | -// TEXTINCLUDE | |
78 | -// | |
79 | - | |
80 | -1 TEXTINCLUDE DISCARDABLE | |
81 | -BEGIN | |
82 | - "resource.h\0" | |
83 | -END | |
84 | - | |
85 | -2 TEXTINCLUDE DISCARDABLE | |
86 | -BEGIN | |
87 | - "#include ""afxres.h""\r\n" | |
88 | - "\0" | |
89 | -END | |
90 | - | |
91 | -3 TEXTINCLUDE DISCARDABLE | |
92 | -BEGIN | |
93 | - "\r\n" | |
94 | - "\0" | |
95 | -END | |
96 | - | |
97 | -#endif // APSTUDIO_INVOKED | |
98 | - | |
99 | -#endif // Finnish resources | |
100 | -///////////////////////////////////////////////////////////////////////////// | |
101 | - | |
102 | - | |
103 | - | |
104 | -#ifndef APSTUDIO_INVOKED | |
105 | -///////////////////////////////////////////////////////////////////////////// | |
106 | -// | |
107 | -// Generated from the TEXTINCLUDE 3 resource. | |
108 | -// | |
109 | - | |
110 | - | |
111 | -///////////////////////////////////////////////////////////////////////////// | |
112 | -#endif // not APSTUDIO_INVOKED | |
113 | - |