Clean up memory allocation for planet-rotate code. This will hopefully reduce
fragmentation and make it easier for the OS to retreive free memory. git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@880 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
@@ -262,10 +262,10 @@ void arith_frame_blit (FRAMEPTR srcFrame, RECT *rsrc, FRAMEPTR dstFrame, RECT *r
|
||||
// bits 17-24 : green
|
||||
// bits 9-16 : blue
|
||||
// bits 1-8 : alpha
|
||||
Uint32 **getpixelarray(FRAMEPTR FramePtr, int width, int height)
|
||||
void getpixelarray(Uint32 *map, FRAMEPTR FramePtr, int width, int height)
|
||||
{
|
||||
Uint8 r,g,b,a;
|
||||
Uint32 p, **map;
|
||||
Uint32 p, pos, row;
|
||||
TFB_Image *tfbImg;
|
||||
SDL_Surface *img;
|
||||
GetPixelFn getpix;
|
||||
@@ -276,24 +276,19 @@ Uint32 **getpixelarray(FRAMEPTR FramePtr, int width, int height)
|
||||
img = (SDL_Surface *)tfbImg->NormalImg;
|
||||
SDL_LockSurface (img);
|
||||
getpix = getpixel_for (img);
|
||||
map=(Uint32 **)HMalloc (sizeof(Uint32 *) * (height + 1));
|
||||
for (y = 0; y < height; y++)
|
||||
for (y = 0, row = 0; y < height; y++, row += width)
|
||||
{
|
||||
map[y]=(Uint32 *)HCalloc (width * sizeof(Uint32));
|
||||
if(y >= img->h)
|
||||
continue;
|
||||
for(x = 0; x < img->w; x++)
|
||||
for(x = 0, pos = row; x < img->w; x++, pos++)
|
||||
{
|
||||
p = getpix (img, x, y);
|
||||
SDL_GetRGBA (p,img->format, &r, &g, &b, &a);
|
||||
map[y][x] = r << 24 | g << 16 | b << 8 | a;
|
||||
map[pos] = r << 24 | g << 16 | b << 8 | a;
|
||||
}
|
||||
}
|
||||
SDL_UnlockSurface (img);
|
||||
UnlockMutex (tfbImg->mutex);
|
||||
map[y] = NULL;
|
||||
return (map);
|
||||
|
||||
}
|
||||
|
||||
FRAMEPTR Build_Font_Effect (FRAMEPTR FramePtr, Uint32 from, Uint32 to, BYTE type)
|
||||
|
||||
@@ -554,18 +554,20 @@ void random16xZoomSurfaceRGBA (SDL_Surface *src, SDL_Surface *dst)
|
||||
blurSurface32 (dst);
|
||||
}
|
||||
|
||||
FRAMEPTR scale16xRandomizeFrame (FRAMEPTR FramePtr)
|
||||
FRAMEPTR scale16xRandomizeFrame (FRAMEPTR NewFrame, FRAMEPTR FramePtr)
|
||||
{
|
||||
TFB_Image *origImg, *newImg;
|
||||
FRAMEPTR NewFrame;
|
||||
UBYTE type;
|
||||
|
||||
if (NewFrame == NULL)
|
||||
{
|
||||
type = (UBYTE)TYPE_GET (GetFrameParentDrawable (FramePtr)
|
||||
->FlagsAndIndex) >> FTYPE_SHIFT;
|
||||
NewFrame = CaptureDrawable (
|
||||
CreateDrawable (type,
|
||||
(SIZE)((GetFrameWidth (FramePtr)) << 2),
|
||||
(SIZE)((GetFrameHeight (FramePtr)) << 2), 1));
|
||||
}
|
||||
|
||||
newImg = NewFrame->image;
|
||||
origImg = FramePtr->image;
|
||||
|
||||
@@ -1224,7 +1224,7 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown)
|
||||
ClearDrawable ();
|
||||
s.origin.x = -new_pt.x + (SURFACE_WIDTH >> 1);
|
||||
s.origin.y = -new_pt.y + (SURFACE_HEIGHT >> 1);
|
||||
s.frame = pSolarSysState->TopoZoomFrame;
|
||||
s.frame = pSolarSysState->Orbit.TopoZoomFrame;
|
||||
DrawStamp (&s);
|
||||
s.origin.x += MAP_WIDTH << MAG_SHIFT;
|
||||
DrawStamp (&s);
|
||||
@@ -1526,7 +1526,7 @@ InitPlanetSide (void)
|
||||
ClearDrawable ();
|
||||
s.origin.x = -pt.x + (SURFACE_WIDTH >> 1);
|
||||
s.origin.y = -pt.y + (SURFACE_HEIGHT >> 1);
|
||||
s.frame = pSolarSysState->TopoZoomFrame;
|
||||
s.frame = pSolarSysState->Orbit.TopoZoomFrame;
|
||||
DrawStamp (&s);
|
||||
s.origin.x += MAP_WIDTH << MAG_SHIFT;
|
||||
DrawStamp (&s);
|
||||
|
||||
@@ -57,19 +57,18 @@ RotatePlanet (int x, int dx, int dy, COUNT scale_amt, UBYTE zoom_from, PRECT zoo
|
||||
COUNT i, num_frames, old_scale;
|
||||
RECT *rp = NULL;
|
||||
CONTEXT OldContext;
|
||||
PLANET_ORBIT *Orbit = &pSolarSysState->Orbit;
|
||||
int base = GSCALE_IDENTITY;
|
||||
|
||||
num_frames = (pSolarSysState->ShieldFrame == 0) ? 1 : 2;
|
||||
pFrame[0] = SetAbsFrameIndex (pSolarSysState->PlanetFrameArray, (COUNT)(x + 1));
|
||||
num_frames = (pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED) ? 2 : 1;
|
||||
pFrame[0] = SetAbsFrameIndex (Orbit->PlanetFrameArray, (COUNT)(x + 1));
|
||||
if (num_frames == 2)
|
||||
pFrame[1] = pSolarSysState->ShieldFrame;
|
||||
pFrame[1] = Orbit->ShieldFrame;
|
||||
if (scale_amt)
|
||||
{
|
||||
if(zoomr->extent.width)
|
||||
rp = zoomr;
|
||||
// we're zooming in, take care of scaling the frames
|
||||
// for (i=0; i < num_frames; i++)
|
||||
// pFrame[i] = pSolarSysState->ScaleFrame[i];
|
||||
//Translate the planet so it comes from the bottom right corner
|
||||
dx += ((zoom_from & 0x01) ? 1 : -1) * dx * (base - scale_amt) / base;
|
||||
dy += ((zoom_from & 0x02) ? 1 : -1) * dy * (base - scale_amt) / base;
|
||||
@@ -120,6 +119,8 @@ DrawPlanet (int x, int y, int dy, unsigned int rgb)
|
||||
{
|
||||
STAMP s;
|
||||
UBYTE a = 128;
|
||||
PLANET_ORBIT *Orbit = &pSolarSysState->Orbit;
|
||||
|
||||
s.origin.x = x;
|
||||
s.origin.y = y;
|
||||
s.frame = pSolarSysState->TopoFrame;
|
||||
@@ -133,8 +134,8 @@ DrawPlanet (int x, int y, int dy, unsigned int rgb)
|
||||
COUNT framew, frameh;
|
||||
RECT srect, drect, *psrect = NULL, *pdrect = NULL;
|
||||
FRAME tintFrame[2];
|
||||
tintFrame[0] = SetAbsFrameIndex (pSolarSysState->TintFrame, (COUNT)(1));
|
||||
tintFrame[1] = SetAbsFrameIndex (pSolarSysState->TintFrame, (COUNT)(2));
|
||||
tintFrame[0] = SetAbsFrameIndex (Orbit->TintFrame, (COUNT)(1));
|
||||
tintFrame[1] = SetAbsFrameIndex (Orbit->TintFrame, (COUNT)(2));
|
||||
|
||||
framew = GetFrameWidth (tintFrame[0]);
|
||||
frameh = GetFrameHeight (tintFrame[0]);
|
||||
|
||||
@@ -187,6 +187,7 @@ void
|
||||
FreePlanet (void)
|
||||
{
|
||||
COUNT i;
|
||||
PLANET_ORBIT *Orbit = &pSolarSysState->Orbit;
|
||||
|
||||
if (pSolarSysState->MenuState.flash_task)
|
||||
{
|
||||
@@ -209,36 +210,30 @@ FreePlanet (void)
|
||||
|
||||
DestroyStringTable (ReleaseStringTable (pSolarSysState->XlatRef));
|
||||
pSolarSysState->XlatRef = 0;
|
||||
UnlockResourceData (pSolarSysState->hTopoData);
|
||||
FreeResourceData (pSolarSysState->hTopoData);
|
||||
pSolarSysState->hTopoData = 0;
|
||||
DestroyDrawable (ReleaseDrawable (pSolarSysState->TopoFrame));
|
||||
pSolarSysState->TopoFrame = 0;
|
||||
DestroyDrawable (ReleaseDrawable (pSolarSysState->TopoZoomFrame));
|
||||
pSolarSysState->TopoZoomFrame = 0;
|
||||
DestroyColorMap (ReleaseColorMap (pSolarSysState->OrbitalCMap));
|
||||
pSolarSysState->OrbitalCMap = 0;
|
||||
DestroyDrawable (ReleaseDrawable (pSolarSysState->PlanetFrameArray));
|
||||
pSolarSysState->PlanetFrameArray = 0;
|
||||
|
||||
HFree (Orbit->lpTopoData);
|
||||
Orbit->lpTopoData = 0;
|
||||
DestroyDrawable (ReleaseDrawable (Orbit->TopoZoomFrame));
|
||||
Orbit->TopoZoomFrame = 0;
|
||||
DestroyDrawable (ReleaseDrawable (Orbit->PlanetFrameArray));
|
||||
Orbit->PlanetFrameArray = 0;
|
||||
|
||||
HFree (pSolarSysState->isPFADefined);
|
||||
pSolarSysState->isPFADefined = 0;
|
||||
if (pSolarSysState->TintFrame)
|
||||
DestroyDrawable (ReleaseDrawable (pSolarSysState->TintFrame));
|
||||
pSolarSysState->TintFrame = 0;
|
||||
HFree (Orbit->isPFADefined);
|
||||
Orbit->isPFADefined = 0;
|
||||
DestroyDrawable (ReleaseDrawable (Orbit->TintFrame));
|
||||
Orbit->TintFrame = 0;
|
||||
pSolarSysState->Tint_rgb = 0;
|
||||
if(pSolarSysState->ShieldFrame != 0)
|
||||
DestroyDrawable (ReleaseDrawable (Orbit->ShieldFrame));
|
||||
Orbit->ShieldFrame = 0;
|
||||
|
||||
if (Orbit->lpTopoMap!=0)
|
||||
{
|
||||
DestroyDrawable (ReleaseDrawable (pSolarSysState->ShieldFrame));
|
||||
pSolarSysState->ShieldFrame = 0;
|
||||
}
|
||||
if (pSolarSysState->lpTopoMap!=0)
|
||||
{
|
||||
for (i=0; pSolarSysState->lpTopoMap[i] != NULL; i++)
|
||||
HFree (pSolarSysState->lpTopoMap[i]);
|
||||
HFree (pSolarSysState->lpTopoMap);
|
||||
pSolarSysState->lpTopoMap = 0;
|
||||
HFree (Orbit->lpTopoMap);
|
||||
Orbit->lpTopoMap = 0;
|
||||
}
|
||||
|
||||
DestroyContext (ReleaseContext (TaskContext));
|
||||
|
||||
@@ -138,6 +138,18 @@ typedef STAR_DESC *PSTAR_DESC;
|
||||
|
||||
typedef void (*PLAN_GEN_FUNC) (BYTE control);
|
||||
|
||||
typedef struct planet_orbit
|
||||
{
|
||||
FRAME TopoZoomFrame;
|
||||
PBYTE lpTopoData;
|
||||
FRAME PlanetFrameArray;
|
||||
BYTE *isPFADefined;
|
||||
FRAME ShieldFrame;
|
||||
FRAME TintFrame;
|
||||
DWORD *lpTopoMap;
|
||||
DWORD *ScratchArray;
|
||||
} PLANET_ORBIT;
|
||||
|
||||
typedef struct solarsys_state
|
||||
{
|
||||
MENU_STATE MenuState;
|
||||
@@ -152,10 +164,6 @@ typedef struct solarsys_state
|
||||
BYTE turn_counter, turn_wait;
|
||||
BYTE thrust_counter, max_ship_speed;
|
||||
|
||||
FRAME TopoFrame;
|
||||
FRAME TopoZoomFrame;
|
||||
MEM_HANDLE hTopoData;
|
||||
PBYTE lpTopoData;
|
||||
STRING XlatRef;
|
||||
STRINGPTR XlatPtr;
|
||||
COLORMAP OrbitalCMap;
|
||||
@@ -166,13 +174,10 @@ typedef struct solarsys_state
|
||||
PLAN_GEN_FUNC GenFunc;
|
||||
|
||||
FRAME PlanetSideFrame[6];
|
||||
FRAME PlanetFrameArray;
|
||||
BYTE *isPFADefined;
|
||||
FRAME ShieldFrame;
|
||||
FRAME TintFrame;
|
||||
UWORD Tint_rgb;
|
||||
DWORD **lpTopoMap;
|
||||
UBYTE PauseRotate;
|
||||
FRAME TopoFrame;
|
||||
PLANET_ORBIT Orbit;
|
||||
} SOLARSYS_STATE;
|
||||
typedef SOLARSYS_STATE *PSOLARSYS_STATE;
|
||||
|
||||
|
||||
@@ -52,9 +52,9 @@ void fill_frame_rgb (FRAME FramePtr, DWORD color, int x0, int y0, int x, int y);
|
||||
|
||||
void arith_frame_blit (FRAME srcFrame, RECT *rsrc, FRAME dstFrame, RECT *rdst, int num, int denom);
|
||||
|
||||
FRAME scale16xRandomizeFrame(FRAME FramePtr);
|
||||
FRAME scale16xRandomizeFrame(FRAME ZoomFrame, FRAME FramePtr);
|
||||
|
||||
DWORD **getpixelarray(FRAME FramePtr,int width, int height);
|
||||
void getpixelarray(DWORD *array, FRAME FramePtr, int width, int height);
|
||||
|
||||
#define NUM_BATCH_POINTS 64
|
||||
#define USE_3D_PLANET 1
|
||||
@@ -111,6 +111,7 @@ RenderTopography (BOOLEAN Reconstruct)
|
||||
{
|
||||
CONTEXT OldContext;
|
||||
FRAME OldFrame;
|
||||
PLANET_ORBIT *Orbit = &pSolarSysState->Orbit;
|
||||
|
||||
OldContext = SetContext (TaskContext);
|
||||
OldFrame = SetContextFGFrame (pSolarSysState->TopoFrame);
|
||||
@@ -166,7 +167,7 @@ RenderTopography (BOOLEAN Reconstruct)
|
||||
cbase = GetColorMapAddress (pSolarSysState->OrbitalCMap);
|
||||
|
||||
pBatch = &BatchArray[i = NUM_BATCH_POINTS];
|
||||
lpDst = pSolarSysState->lpTopoData;
|
||||
lpDst = Orbit->lpTopoData;
|
||||
for (pt.y = 0; pt.y < MAP_HEIGHT; ++pt.y)
|
||||
{
|
||||
for (pt.x = 0; pt.x < MAP_WIDTH; ++pt.x)
|
||||
@@ -512,10 +513,8 @@ static void CreateShieldMask (void)
|
||||
FRAME ShieldFrame;
|
||||
DWORD aa_delta, aa_delta2;
|
||||
|
||||
ShieldFrame = CaptureDrawable (
|
||||
CreateDrawable (WANT_PIXMAP, SHIELD_DIAM, SHIELD_DIAM, 1)
|
||||
);
|
||||
rgba = (DWORD *)HMalloc (sizeof (DWORD *) * (SHIELD_DIAM) * (SHIELD_DIAM));
|
||||
ShieldFrame = pSolarSysState->Orbit.ShieldFrame;
|
||||
rgba = pSolarSysState->Orbit.ScratchArray;
|
||||
p_rgba = rgba;
|
||||
// This is a non-transparent red for the halo
|
||||
red_nt = 180;
|
||||
@@ -565,13 +564,11 @@ static void CreateShieldMask (void)
|
||||
}
|
||||
process_rgb_bmp (ShieldFrame, rgba, SHIELD_DIAM, SHIELD_DIAM);
|
||||
SetFrameHot (ShieldFrame, MAKE_HOT_SPOT (SHIELD_RADIUS + 1,SHIELD_RADIUS + 1));
|
||||
HFree(rgba);
|
||||
pSolarSysState->ShieldFrame = ShieldFrame;
|
||||
{
|
||||
// Applythe shield to the topo data
|
||||
UBYTE a;
|
||||
int blit_type;
|
||||
FRAME tintFrame = pSolarSysState->TintFrame;
|
||||
FRAME tintFrame = pSolarSysState->Orbit.TintFrame;
|
||||
#ifdef USE_ALPHA_SHIELD
|
||||
a = 200;
|
||||
blit_type = 0;
|
||||
@@ -590,13 +587,14 @@ static void CreateShieldMask (void)
|
||||
// RenderLevelMasks builds a frame for the rotating planet view
|
||||
// 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
|
||||
#define PT_TO_ADDR(y, x) ((y) * (MAP_WIDTH + MAP_HEIGHT) + (x))
|
||||
void
|
||||
RenderLevelMasks (int offset)
|
||||
{
|
||||
POINT pt;
|
||||
DWORD *rgba, *p_rgba;
|
||||
int x, y;
|
||||
DWORD p, **pixels;
|
||||
DWORD p, *pixels;
|
||||
FRAME MaskFrame;
|
||||
|
||||
#if PROFILE
|
||||
@@ -605,11 +603,11 @@ RenderLevelMasks (int offset)
|
||||
clock_t t1;
|
||||
t1 = clock ();
|
||||
#endif
|
||||
rgba = (DWORD *)HMalloc (sizeof (DWORD *) * (DIAMETER) * (DIAMETER));
|
||||
rgba = pSolarSysState->Orbit.ScratchArray;
|
||||
p_rgba = rgba;
|
||||
// Choose the correct Frame to wrte to
|
||||
MaskFrame = SetAbsFrameIndex (pSolarSysState->PlanetFrameArray, (COUNT)(offset + 1));
|
||||
pixels = pSolarSysState->lpTopoMap;
|
||||
MaskFrame = SetAbsFrameIndex (pSolarSysState->Orbit.PlanetFrameArray, (COUNT)(offset + 1));
|
||||
pixels = pSolarSysState->Orbit.lpTopoMap;
|
||||
for (pt.y = 0, y = -RADIUS; pt.y <= TWORADIUS; ++pt.y, ++y)
|
||||
{
|
||||
for (pt.x = 0, x = -RADIUS; pt.x <= TWORADIUS; ++pt.x, ++x)
|
||||
@@ -626,7 +624,7 @@ RenderLevelMasks (int offset)
|
||||
{
|
||||
if (ppt->m[0] == 0)
|
||||
{
|
||||
p = pixels[ppt->p[0].y][ppt->p[0].x + offset];
|
||||
p = pixels[PT_TO_ADDR (ppt->p[0].y, ppt->p[0].x) + offset];
|
||||
c[0] = (UBYTE)(p >> 8);
|
||||
c[1] = (UBYTE)(p >> 16);
|
||||
c[2] = (UBYTE)(p >> 24);
|
||||
@@ -634,12 +632,12 @@ RenderLevelMasks (int offset)
|
||||
else
|
||||
{
|
||||
for (i = 0; i < 4; i++)
|
||||
p1[i]=pixels[ppt->p[i].y][ppt->p[i].x + offset];
|
||||
p1[i]=pixels[PT_TO_ADDR (ppt->p[i].y, ppt->p[i].x) + offset];
|
||||
for (i = 1; i < 4; i++)
|
||||
c[i-1] = get_avg_rgb (p1, ppt->m, i);
|
||||
}
|
||||
// Apply the lighting model. This also bounds the sphere to make it circular
|
||||
if (pSolarSysState->ShieldFrame)
|
||||
if (pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED)
|
||||
{
|
||||
c[2] = GET_LIGHT (255, diffus, spec);
|
||||
c[1] = GET_LIGHT ((UBYTE)(c[1] >> 1), diffus, spec);
|
||||
@@ -661,12 +659,11 @@ RenderLevelMasks (int offset)
|
||||
// Map the rgb bitmap onto the SDL_Surface
|
||||
process_rgb_bmp (MaskFrame, rgba, DIAMETER, DIAMETER);
|
||||
SetFrameHot (MaskFrame, MAKE_HOT_SPOT (RADIUS + 1, RADIUS + 1));
|
||||
HFree(rgba);
|
||||
#if PROFILE
|
||||
t += clock() - t1;
|
||||
if (frames_done == MAP_WIDTH)
|
||||
{
|
||||
fprintf (stderr, "frames/sec: %d/%d(msec)=%f\n", frames_done, t,
|
||||
fprintf (stderr, "frames/sec: %d/%ld(msec)=%f\n", frames_done, t,
|
||||
frames_done / ((double)t / CLOCKS_PER_SEC));
|
||||
frames_done = 1;
|
||||
t = clock () - t1;
|
||||
@@ -1191,6 +1188,31 @@ ValidateMap (PSBYTE DepthArray)
|
||||
} while (--i);
|
||||
}
|
||||
|
||||
void planet_orbit_init ()
|
||||
{
|
||||
PLANET_ORBIT *Orbit = &pSolarSysState->Orbit;
|
||||
|
||||
Orbit->isPFADefined = (BYTE *)HCalloc (sizeof(BYTE) * MAP_WIDTH);
|
||||
Orbit->PlanetFrameArray = CaptureDrawable (
|
||||
CreateDrawable (WANT_PIXMAP, DIAMETER, DIAMETER, (COUNT)MAP_WIDTH)
|
||||
);
|
||||
Orbit->TintFrame = CaptureDrawable (
|
||||
CreateDrawable (WANT_PIXMAP, (SWORD)MAP_WIDTH, (SWORD)MAP_HEIGHT, 2)
|
||||
);
|
||||
Orbit->ShieldFrame = CaptureDrawable (
|
||||
CreateDrawable (WANT_PIXMAP, SHIELD_DIAM, SHIELD_DIAM, 1)
|
||||
);
|
||||
|
||||
Orbit->lpTopoData = HMalloc (MAP_WIDTH * MAP_HEIGHT);
|
||||
Orbit->TopoZoomFrame = CaptureDrawable (
|
||||
CreateDrawable (WANT_PIXMAP, (COUNT)(MAP_WIDTH << 2),
|
||||
(COUNT)(MAP_HEIGHT << 2), 1));
|
||||
Orbit->lpTopoMap=(DWORD *)HMalloc (sizeof(DWORD)
|
||||
* (MAP_HEIGHT * (MAP_WIDTH + MAP_HEIGHT)));
|
||||
Orbit->ScratchArray = (DWORD *)HMalloc (sizeof (DWORD *)
|
||||
* (SHIELD_DIAM) * (SHIELD_DIAM));
|
||||
}
|
||||
|
||||
void
|
||||
GeneratePlanetMask (PPLANET_DESC pPlanetDesc, BOOLEAN IsEarth)
|
||||
{
|
||||
@@ -1200,18 +1222,12 @@ GeneratePlanetMask (PPLANET_DESC pPlanetDesc, BOOLEAN IsEarth)
|
||||
COUNT i, x, y;
|
||||
POINT loc;
|
||||
CONTEXT OldContext;
|
||||
PLANET_ORBIT *Orbit = &pSolarSysState->Orbit;
|
||||
|
||||
old_seed = TFB_SeedRandom (pPlanetDesc->rand_seed);
|
||||
|
||||
OldContext = SetContext (TaskContext);
|
||||
pSolarSysState->isPFADefined = (BYTE *)HCalloc (sizeof(BYTE) * 255);
|
||||
pSolarSysState->TintFrame = CaptureDrawable (
|
||||
CreateDrawable (WANT_PIXMAP, (SWORD)MAP_WIDTH, (SWORD)MAP_HEIGHT, 2)
|
||||
);
|
||||
|
||||
pSolarSysState->PlanetFrameArray = CaptureDrawable (
|
||||
CreateDrawable (WANT_PIXMAP, DIAMETER, DIAMETER, (COUNT)MAP_WIDTH)
|
||||
);
|
||||
planet_orbit_init ();
|
||||
if (IsEarth)
|
||||
{
|
||||
//Earth uses a pixmap for the topography
|
||||
@@ -1230,25 +1246,19 @@ GeneratePlanetMask (PPLANET_DESC pPlanetDesc, BOOLEAN IsEarth)
|
||||
r.corner.x = r.corner.y = 0;
|
||||
r.extent.width = MAP_WIDTH;
|
||||
r.extent.height = MAP_HEIGHT;
|
||||
if (pSolarSysState->hTopoData == 0)
|
||||
{
|
||||
pSolarSysState->hTopoData = AllocResourceData (MAP_WIDTH * MAP_HEIGHT, 0);
|
||||
LockResourceData (pSolarSysState->hTopoData, &pSolarSysState->lpTopoData);
|
||||
}
|
||||
if (pSolarSysState->lpTopoData)
|
||||
{
|
||||
memset (pSolarSysState->lpTopoData, 0, MAP_WIDTH * MAP_HEIGHT);
|
||||
memset (Orbit->lpTopoData, 0, MAP_WIDTH * MAP_HEIGHT);
|
||||
switch (PLANALGO (PlanDataPtr->Type))
|
||||
{
|
||||
case GAS_GIANT_ALGO:
|
||||
MakeGasGiant (PlanDataPtr->num_faults,
|
||||
pSolarSysState->lpTopoData, &r, PlanDataPtr->fault_depth);
|
||||
Orbit->lpTopoData, &r, PlanDataPtr->fault_depth);
|
||||
break;
|
||||
case TOPO_ALGO:
|
||||
case CRATERED_ALGO:
|
||||
if (PlanDataPtr->num_faults)
|
||||
DeltaTopography (PlanDataPtr->num_faults,
|
||||
pSolarSysState->lpTopoData, &r, PlanDataPtr->fault_depth);
|
||||
Orbit->lpTopoData, &r, PlanDataPtr->fault_depth);
|
||||
|
||||
for (i = 0; i < PlanDataPtr->num_blemishes; ++i)
|
||||
{
|
||||
@@ -1284,19 +1294,17 @@ GeneratePlanetMask (PPLANET_DESC pPlanetDesc, BOOLEAN IsEarth)
|
||||
% (MAP_WIDTH - crater_r.extent.width);
|
||||
crater_r.corner.y = LOBYTE (loword)
|
||||
% (MAP_HEIGHT - crater_r.extent.height);
|
||||
MakeCrater (&crater_r, pSolarSysState->lpTopoData,
|
||||
MakeCrater (&crater_r, Orbit->lpTopoData,
|
||||
PlanDataPtr->fault_depth << 2,
|
||||
-(PlanDataPtr->fault_depth << 2),
|
||||
FALSE);
|
||||
}
|
||||
|
||||
if (PLANALGO (PlanDataPtr->Type) == CRATERED_ALGO)
|
||||
DitherMap (pSolarSysState->lpTopoData);
|
||||
ValidateMap (pSolarSysState->lpTopoData);
|
||||
DitherMap (Orbit->lpTopoData);
|
||||
ValidateMap (Orbit->lpTopoData);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
pSolarSysState->TopoFrame = CaptureDrawable (
|
||||
CreateDrawable (WANT_PIXMAP, (SIZE)MAP_WIDTH, (SIZE)MAP_HEIGHT, 1)
|
||||
@@ -1331,14 +1339,12 @@ GeneratePlanetMask (PPLANET_DESC pPlanetDesc, BOOLEAN IsEarth)
|
||||
// from lpTopoData instead of the FRAMPTR though
|
||||
x = MAP_WIDTH + MAP_HEIGHT;
|
||||
y = MAP_HEIGHT;
|
||||
pSolarSysState->TopoZoomFrame = scale16xRandomizeFrame(pSolarSysState->TopoFrame);
|
||||
pSolarSysState->lpTopoMap = getpixelarray (
|
||||
pSolarSysState->TopoFrame, x, y
|
||||
);
|
||||
scale16xRandomizeFrame(Orbit->TopoZoomFrame, pSolarSysState->TopoFrame);
|
||||
getpixelarray (Orbit->lpTopoMap, pSolarSysState->TopoFrame, x, y);
|
||||
// Extend the width from MAP_WIDTH to MAP_WIDTH+MAP_HEIGHT
|
||||
for (y = 0; y < MAP_HEIGHT; y++)
|
||||
for (y = 0; y < MAP_HEIGHT * (MAP_WIDTH + MAP_HEIGHT); y+= MAP_WIDTH + MAP_HEIGHT)
|
||||
for (x = 0; x < MAP_HEIGHT; x++)
|
||||
pSolarSysState->lpTopoMap[y][x + MAP_WIDTH] = pSolarSysState->lpTopoMap[y][x];
|
||||
Orbit->lpTopoMap[y + x + MAP_WIDTH] = Orbit->lpTopoMap[y +x];
|
||||
if (pSolarSysState->pOrbitalDesc->pPrevDesc == &pSolarSysState->SunDesc[0])
|
||||
{
|
||||
// This is a planet. Get its location
|
||||
@@ -1371,7 +1377,6 @@ rotate_planet_task (void *data)
|
||||
UBYTE zoom_from;
|
||||
COUNT zoom_arr[50];
|
||||
COUNT zoom_amt, frame_num = 0, zoom_frames;
|
||||
int angle=0;
|
||||
|
||||
Task task = (Task) data;
|
||||
|
||||
@@ -1390,7 +1395,7 @@ rotate_planet_task (void *data)
|
||||
init_x = (i == 1) ? (0) : (MAP_WIDTH - 1);
|
||||
// Render the first planet frame
|
||||
RenderLevelMasks (init_x);
|
||||
pSolarSysState->isPFADefined[init_x] = 1;
|
||||
pSolarSysState->Orbit.isPFADefined[init_x] = 1;
|
||||
|
||||
zoom_from = (UBYTE)TFB_Random () & 0x03;
|
||||
zoom_frames = init_zoom_array (zoom_arr);
|
||||
@@ -1438,9 +1443,9 @@ rotate_planet_task (void *data)
|
||||
|
||||
ClearSemaphore (GraphicsSem);
|
||||
// If this frame hasn't been generted, generate it
|
||||
if (! pSolarSysState->isPFADefined[x]) {
|
||||
if (! pSolarSysState->Orbit.isPFADefined[x]) {
|
||||
RenderLevelMasks (x);
|
||||
pSolarSysState->isPFADefined[x] = 1;
|
||||
pSolarSysState->Orbit.isPFADefined[x] = 1;
|
||||
}
|
||||
if (zooming)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user