Removed rotating planet frame caching; fixed (invisible) shield throb desync; minor cleanups

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@2324 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
avolkov
2006-04-25 00:03:44 +00:00
parent 44a81f3c09
commit 0bc5af7c3c
4 changed files with 31 additions and 31 deletions
+3 -1
View File
@@ -60,7 +60,7 @@ RotatePlanet (int x, int dx, int dy, COUNT scale_amt, UBYTE zoom_from, PRECT zoo
int base = GSCALE_IDENTITY; int base = GSCALE_IDENTITY;
num_frames = 1; num_frames = 1;
pFrame[0] = SetAbsFrameIndex (Orbit->PlanetFrameArray, (COUNT)(x + 1)); pFrame[0] = Orbit->PlanetFrameArray;
if (Orbit->ObjectFrame) if (Orbit->ObjectFrame)
{ {
pFrame[1] = Orbit->ObjectFrame; pFrame[1] = Orbit->ObjectFrame;
@@ -116,6 +116,8 @@ RotatePlanet (int x, int dx, int dy, COUNT scale_amt, UBYTE zoom_from, PRECT zoo
return zoomr; return zoomr;
} }
return NULL; return NULL;
(void)x; // unused param
} }
void void
-2
View File
@@ -242,8 +242,6 @@ FreePlanet (void)
DestroyDrawable (ReleaseDrawable (Orbit->PlanetFrameArray)); DestroyDrawable (ReleaseDrawable (Orbit->PlanetFrameArray));
Orbit->PlanetFrameArray = 0; Orbit->PlanetFrameArray = 0;
HFree (Orbit->isPFADefined);
Orbit->isPFADefined = 0;
DestroyDrawable (ReleaseDrawable (Orbit->TintFrame)); DestroyDrawable (ReleaseDrawable (Orbit->TintFrame));
Orbit->TintFrame = 0; Orbit->TintFrame = 0;
pSolarSysState->Tint_rgb = 0; pSolarSysState->Tint_rgb = 0;
+1 -3
View File
@@ -150,9 +150,7 @@ typedef struct planet_orbit
// data is signed for planets other than gas giants // data is signed for planets other than gas giants
// transformed to light variance map for 3d planet // transformed to light variance map for 3d planet
FRAME PlanetFrameArray; FRAME PlanetFrameArray;
// cached rotating 3d planet frames // rotating 3d planet frames (current and next)
BYTE *isPFADefined;
// cached frames 'present' flags
FRAME ObjectFrame; FRAME ObjectFrame;
// any extra planetary object (shield, atmo, rings) // any extra planetary object (shield, atmo, rings)
// automatically drawn if present // automatically drawn if present
+27 -25
View File
@@ -614,8 +614,7 @@ CreateShieldMask (void)
} }
// SetShieldThrobEffect adjusts the red levels in the shield glow graphic // SetShieldThrobEffect adjusts the red levels in the shield glow graphic
// the throbbing cycle MUST be == 0 (mod MAP_WIDTH), or it will go // the throbbing cycle is tied to the planet rotation cycle
// out of sync with RenderLevelMasks()
#define SHIELD_THROBS 12 #define SHIELD_THROBS 12
// throb cycles per revolution // throb cycles per revolution
#define THROB_CYCLE ((MAP_WIDTH << 8) / SHIELD_THROBS) #define THROB_CYCLE ((MAP_WIDTH << 8) / SHIELD_THROBS)
@@ -679,6 +678,7 @@ SetShieldThrobEffect (FRAME ShieldFrame, int offset, FRAME ThrobFrame)
} }
process_rgb_bmp (ThrobFrame, Orbit->ScratchArray, width, height); process_rgb_bmp (ThrobFrame, Orbit->ScratchArray, width, height);
SetFrameHot (ThrobFrame, GetFrameHot (ShieldFrame));
} }
// Apply the shield to the topo image // Apply the shield to the topo image
@@ -738,7 +738,7 @@ get_map_elev (SBYTE *elevs, int x, int y, int offset)
// offset is effectively the angle of rotation around the planet's axis // offset is effectively the angle of rotation around the planet's axis
// We use the SDL routines to directly write to the SDL_Surface to improve performance // We use the SDL routines to directly write to the SDL_Surface to improve performance
void void
RenderLevelMasks (int offset, BOOLEAN doThrob) RenderLevelMasks (FRAME MaskFrame, int offset, BOOLEAN doThrob)
{ {
POINT pt; POINT pt;
DWORD *rgba, *p_rgba; DWORD *rgba, *p_rgba;
@@ -746,7 +746,6 @@ RenderLevelMasks (int offset, BOOLEAN doThrob)
int x, y; int x, y;
DWORD *pixels; DWORD *pixels;
SBYTE *elevs; SBYTE *elevs;
FRAME MaskFrame;
int shLevel; int shLevel;
#if PROFILE #if PROFILE
@@ -761,9 +760,6 @@ RenderLevelMasks (int offset, BOOLEAN doThrob)
rgba = pSolarSysState->Orbit.ScratchArray; rgba = pSolarSysState->Orbit.ScratchArray;
p_rgba = rgba; p_rgba = rgba;
// Choose the correct Frame to write to
MaskFrame = SetAbsFrameIndex (pSolarSysState->Orbit.PlanetFrameArray,
(COUNT)(offset + 1));
clear = frame_mapRGBA (MaskFrame, 0, 0, 0, 0); clear = frame_mapRGBA (MaskFrame, 0, 0, 0, 0);
pixels = pSolarSysState->Orbit.lpTopoMap + offset; pixels = pSolarSysState->Orbit.lpTopoMap + offset;
elevs = pSolarSysState->Orbit.lpTopoData; elevs = pSolarSysState->Orbit.lpTopoData;
@@ -1347,10 +1343,9 @@ planet_orbit_init ()
{ {
PLANET_ORBIT *Orbit = &pSolarSysState->Orbit; PLANET_ORBIT *Orbit = &pSolarSysState->Orbit;
Orbit->isPFADefined = (BYTE *)HCalloc (sizeof(BYTE) * MAP_WIDTH);
Orbit->PlanetFrameArray = CaptureDrawable ( Orbit->PlanetFrameArray = CaptureDrawable (
CreateDrawable (WANT_PIXMAP | WANT_ALPHA, DIAMETER, DIAMETER, CreateDrawable (WANT_PIXMAP | WANT_ALPHA, DIAMETER, DIAMETER,
(COUNT)MAP_WIDTH)); 2));
Orbit->TintFrame = CaptureDrawable ( Orbit->TintFrame = CaptureDrawable (
CreateDrawable (WANT_PIXMAP | WANT_ALPHA, (SWORD)MAP_WIDTH, CreateDrawable (WANT_PIXMAP | WANT_ALPHA, (SWORD)MAP_WIDTH,
(SWORD)MAP_HEIGHT, 2)); (SWORD)MAP_HEIGHT, 2));
@@ -2005,7 +2000,7 @@ int
rotate_planet_task (void *data) rotate_planet_task (void *data)
{ {
Task task = (Task) data; Task task = (Task) data;
SIZE i; SIZE spin_dir;
COORD init_x; COORD init_x;
DWORD TimeIn; DWORD TimeIn;
PSOLARSYS_STATE pSS; PSOLARSYS_STATE pSS;
@@ -2018,6 +2013,7 @@ rotate_planet_task (void *data)
FRAME OldShieldFrame = 0; FRAME OldShieldFrame = 0;
FRAME ShieldFrame = 0; FRAME ShieldFrame = 0;
BOOLEAN doThrob = FALSE; BOOLEAN doThrob = FALSE;
COUNT altfi; // alternating frame index
r.extent.width = 0; r.extent.width = 0;
zooming = TRUE; zooming = TRUE;
@@ -2030,8 +2026,9 @@ rotate_planet_task (void *data)
SetPlanetTilt (pSS->SysInfo.PlanetInfo.AxialTilt); SetPlanetTilt (pSS->SysInfo.PlanetInfo.AxialTilt);
Orbit = &pSolarSysState->Orbit; Orbit = &pSolarSysState->Orbit;
i = 1 - ((pSS->SysInfo.PlanetInfo.AxialTilt & 1) << 1); spin_dir = 1 - ((pSS->SysInfo.PlanetInfo.AxialTilt & 1) << 1);
init_x = (i == 1) ? (0) : (MAP_WIDTH - 1); init_x = (spin_dir == 1) ? (0) : (MAP_WIDTH - 1);
altfi = 0;
if (optWhichShield == OPT_3DO && if (optWhichShield == OPT_3DO &&
pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED) pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED)
@@ -2042,16 +2039,13 @@ rotate_planet_task (void *data)
ShieldFrame = CaptureDrawable ( ShieldFrame = CaptureDrawable (
CreateDrawable (WANT_PIXMAP | WANT_ALPHA, CreateDrawable (WANT_PIXMAP | WANT_ALPHA,
GetFrameWidth (OldShieldFrame), GetFrameWidth (OldShieldFrame),
GetFrameHeight (OldShieldFrame), 1)); GetFrameHeight (OldShieldFrame), 2));
SetFrameHot (ShieldFrame, GetFrameHot (OldShieldFrame));
Orbit->ObjectFrame = ShieldFrame;
SetShieldThrobEffect (OldShieldFrame, init_x, ShieldFrame); SetShieldThrobEffect (OldShieldFrame, init_x, ShieldFrame);
} }
// Render the first planet frame // Render the first planet frame
RenderLevelMasks (init_x, doThrob); RenderLevelMasks (Orbit->PlanetFrameArray, init_x, doThrob);
pSolarSysState->Orbit.isPFADefined[init_x] = 1;
zoom_from = (UBYTE)TFB_Random () & 0x03; zoom_from = (UBYTE)TFB_Random () & 0x03;
zoom_frames = init_zoom_array (zoom_arr); zoom_frames = init_zoom_array (zoom_arr);
@@ -2087,6 +2081,15 @@ rotate_planet_task (void *data)
if (*(volatile UBYTE *)&pSS->PauseRotate == 2) if (*(volatile UBYTE *)&pSS->PauseRotate == 2)
pSS->PauseRotate = 1; pSS->PauseRotate = 1;
// go to the next frame
Orbit->PlanetFrameArray = SetAbsFrameIndex (
Orbit->PlanetFrameArray, altfi);
if (doThrob)
{
Orbit->ObjectFrame = SetAbsFrameIndex (
ShieldFrame, altfi);
}
repair = RotatePlanet (x, SIS_SCREEN_WIDTH >> 1, repair = RotatePlanet (x, SIS_SCREEN_WIDTH >> 1,
(148 - SIS_ORG_Y) >> 1, zoom_amt, zoom_from, repair); (148 - SIS_ORG_Y) >> 1, zoom_amt, zoom_from, repair);
@@ -2096,22 +2099,21 @@ rotate_planet_task (void *data)
zoom_amt = 0; zoom_amt = 0;
++pSS->MenuState.Initialized; ++pSS->MenuState.Initialized;
} }
x += i; x += spin_dir;
} }
else else
view_index++; view_index++;
UnlockMutex (GraphicsLock); UnlockMutex (GraphicsLock);
// If this frame hasn't been generted, generate it // Generate the next rotation frame
if (!Orbit->isPFADefined[x]) altfi ^= 1;
{ RenderLevelMasks (SetAbsFrameIndex (Orbit->PlanetFrameArray,
RenderLevelMasks (x, doThrob); altfi), x, doThrob);
Orbit->isPFADefined[x] = 1;
}
if (doThrob) if (doThrob)
{ // prepare next throb frame { // prepare next throb frame
SetShieldThrobEffect (OldShieldFrame, x, ShieldFrame); SetShieldThrobEffect (OldShieldFrame, x,
SetAbsFrameIndex (ShieldFrame, altfi));
} }
if (zooming) if (zooming)