Added SIS w/ modules geberation, image rotation and scaling to presentation player; new commands
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@1494 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
+192
-8
@@ -22,7 +22,9 @@
|
|||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include "sounds.h"
|
#include "sounds.h"
|
||||||
#include "fmv.h"
|
#include "fmv.h"
|
||||||
|
#include "resinst.h"
|
||||||
#include "libs/graphics/gfx_common.h"
|
#include "libs/graphics/gfx_common.h"
|
||||||
|
#include "libs/graphics/drawable.h"
|
||||||
#include "libs/sound/sound.h"
|
#include "libs/sound/sound.h"
|
||||||
//#include "libs/vidlib.h"
|
//#include "libs/vidlib.h"
|
||||||
#include "libs/inplib.h"
|
#include "libs/inplib.h"
|
||||||
@@ -46,6 +48,10 @@ typedef struct
|
|||||||
FRAME Frame;
|
FRAME Frame;
|
||||||
MUSIC_REF MusicRef;
|
MUSIC_REF MusicRef;
|
||||||
BOOLEAN Batched;
|
BOOLEAN Batched;
|
||||||
|
FRAME SisFrame;
|
||||||
|
FRAME RotatedFrame;
|
||||||
|
int LastDrawKind;
|
||||||
|
int LastAngle;
|
||||||
COUNT OperIndex;
|
COUNT OperIndex;
|
||||||
COLOR TextFadeColor;
|
COLOR TextFadeColor;
|
||||||
COLOR TextColor;
|
COLOR TextColor;
|
||||||
@@ -174,6 +180,103 @@ Present_UnbatchGraphics (PRESENTATION_INPUT_STATE* pPIS, BOOLEAN bYield)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
Present_GenerateSIS (PRESENTATION_INPUT_STATE* pPIS)
|
||||||
|
{
|
||||||
|
#define MODULE_YOFS_P (-79)
|
||||||
|
#define DRIVE_TOP_Y_P (DRIVE_TOP_Y + MODULE_YOFS_P)
|
||||||
|
#define JET_TOP_Y_P (JET_TOP_Y + MODULE_YOFS_P)
|
||||||
|
#define MODULE_TOP_Y_P (MODULE_TOP_Y + MODULE_YOFS_P)
|
||||||
|
CONTEXT OldContext;
|
||||||
|
FRAME SisFrame;
|
||||||
|
FRAME ModuleFrame;
|
||||||
|
FRAME SkelFrame;
|
||||||
|
STAMP s;
|
||||||
|
RECT r;
|
||||||
|
HOT_SPOT hs;
|
||||||
|
int slot;
|
||||||
|
COUNT piece;
|
||||||
|
|
||||||
|
LockMutex (GraphicsLock);
|
||||||
|
OldContext = SetContext (OffScreenContext);
|
||||||
|
|
||||||
|
SkelFrame = CaptureDrawable (LoadCelFile ("slides/ending/sis_skel.ani"));
|
||||||
|
ModuleFrame = CaptureDrawable (LoadGraphic (SISMODS_MASK_PMAP_ANIM));
|
||||||
|
/* TODO: fix this eventually;
|
||||||
|
* we need to load *all* gfx resources from this package
|
||||||
|
* otherwise we will leave the package hanging, literally
|
||||||
|
*/
|
||||||
|
DestroyDrawable (LoadGraphic (OUTFIT_PMAP_ANIM));
|
||||||
|
|
||||||
|
GetFrameRect (SkelFrame, &r);
|
||||||
|
SisFrame = CaptureDrawable (CreateDrawable (
|
||||||
|
WANT_PIXMAP, r.extent.width, r.extent.height, 1
|
||||||
|
));
|
||||||
|
SetContextFGFrame (SisFrame);
|
||||||
|
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (1, 1, 1), 7));
|
||||||
|
DrawFilledRectangle (&r);
|
||||||
|
|
||||||
|
s.frame = SetAbsFrameIndex (SkelFrame, 0);
|
||||||
|
s.origin.x = 0;
|
||||||
|
s.origin.y = 0;
|
||||||
|
DrawStamp (&s);
|
||||||
|
|
||||||
|
for (slot = 0; slot < NUM_DRIVE_SLOTS; ++slot)
|
||||||
|
{
|
||||||
|
piece = GLOBAL_SIS (DriveSlots[slot]);
|
||||||
|
if (piece < EMPTY_SLOT)
|
||||||
|
{
|
||||||
|
s.origin.x = DRIVE_TOP_X;
|
||||||
|
s.origin.y = DRIVE_TOP_Y_P;
|
||||||
|
s.origin.x += slot * SHIP_PIECE_OFFSET;
|
||||||
|
s.frame = SetAbsFrameIndex (ModuleFrame, piece);
|
||||||
|
DrawStamp (&s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (slot = 0; slot < NUM_JET_SLOTS; ++slot)
|
||||||
|
{
|
||||||
|
piece = GLOBAL_SIS (JetSlots[slot]);
|
||||||
|
if (piece < EMPTY_SLOT)
|
||||||
|
{
|
||||||
|
s.origin.x = JET_TOP_X;
|
||||||
|
s.origin.y = JET_TOP_Y_P;
|
||||||
|
s.origin.x += slot * SHIP_PIECE_OFFSET;
|
||||||
|
s.frame = SetAbsFrameIndex (ModuleFrame, piece);
|
||||||
|
DrawStamp (&s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (slot = 0; slot < NUM_MODULE_SLOTS; ++slot)
|
||||||
|
{
|
||||||
|
piece = GLOBAL_SIS (ModuleSlots[slot]);
|
||||||
|
if (piece < EMPTY_SLOT)
|
||||||
|
{
|
||||||
|
s.origin.x = MODULE_TOP_X;
|
||||||
|
s.origin.y = MODULE_TOP_Y_P;
|
||||||
|
s.origin.x += slot * SHIP_PIECE_OFFSET;
|
||||||
|
s.frame = SetAbsFrameIndex (ModuleFrame, piece);
|
||||||
|
DrawStamp (&s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DestroyDrawable (ReleaseDrawable (SkelFrame));
|
||||||
|
DestroyDrawable (ReleaseDrawable (ModuleFrame));
|
||||||
|
|
||||||
|
hs.x = r.extent.width / 2;
|
||||||
|
hs.y = r.extent.height / 2;
|
||||||
|
SetFrameHot (SisFrame, hs);
|
||||||
|
|
||||||
|
/* TODO: this is a hack to get it to work
|
||||||
|
* anyone know how to do this better? */
|
||||||
|
TFB_DrawCanvas_SetTransparentColor (
|
||||||
|
((PFRAME_DESC)SisFrame)->image->NormalImg, 8, 8, 8, TRUE);
|
||||||
|
|
||||||
|
SetContext (OldContext);
|
||||||
|
FlushGraphics ();
|
||||||
|
UnlockMutex (GraphicsLock);
|
||||||
|
|
||||||
|
pPIS->SisFrame = SisFrame;
|
||||||
|
}
|
||||||
|
|
||||||
static BOOLEAN
|
static BOOLEAN
|
||||||
DoPresentation (PVOID pIS)
|
DoPresentation (PVOID pIS)
|
||||||
{
|
{
|
||||||
@@ -200,7 +303,7 @@ DoPresentation (PVOID pIS)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
SleepThread (ONE_SECOND / 20);
|
SleepThread (ONE_SECOND / 84);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,15 +339,17 @@ DoPresentation (PVOID pIS)
|
|||||||
UnlockMutex (GraphicsLock);
|
UnlockMutex (GraphicsLock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (strcmp (Opcode, "FONT") == 0)
|
else if (strcmp (Opcode, "FONT") == 0)
|
||||||
{ /* set font */
|
{ /* set font */
|
||||||
CopyTextString (pPIS->Buffer, sizeof(pPIS->Buffer), pStr);
|
CopyTextString (pPIS->Buffer, sizeof(pPIS->Buffer), pStr);
|
||||||
if (pPIS->Font)
|
if (pPIS->Font)
|
||||||
DestroyFont (ReleaseFont (pPIS->Font));
|
DestroyFont (ReleaseFont (pPIS->Font));
|
||||||
pPIS->Font = CaptureFont ((FONT_REF) LoadFontFile (pPIS->Buffer));
|
pPIS->Font = CaptureFont ((FONT_REF) LoadFontFile (pPIS->Buffer));
|
||||||
|
|
||||||
|
if (!pPIS->Batched)
|
||||||
LockMutex (GraphicsLock);
|
LockMutex (GraphicsLock);
|
||||||
SetContextFont (pPIS->Font);
|
SetContextFont (pPIS->Font);
|
||||||
|
if (!pPIS->Batched)
|
||||||
UnlockMutex (GraphicsLock);
|
UnlockMutex (GraphicsLock);
|
||||||
}
|
}
|
||||||
else if (strcmp (Opcode, "ANI") == 0)
|
else if (strcmp (Opcode, "ANI") == 0)
|
||||||
@@ -332,8 +437,10 @@ DoPresentation (PVOID pIS)
|
|||||||
pPIS->LinesCount = ParseTextLines (pPIS->TextLines,
|
pPIS->LinesCount = ParseTextLines (pPIS->TextLines,
|
||||||
MAX_TEXT_LINES, pPIS->Buffer);
|
MAX_TEXT_LINES, pPIS->Buffer);
|
||||||
|
|
||||||
|
if (!pPIS->Batched)
|
||||||
LockMutex (GraphicsLock);
|
LockMutex (GraphicsLock);
|
||||||
GetContextFontLeading (&leading);
|
GetContextFontLeading (&leading);
|
||||||
|
if (!pPIS->Batched)
|
||||||
UnlockMutex (GraphicsLock);
|
UnlockMutex (GraphicsLock);
|
||||||
switch (pPIS->TextVPos)
|
switch (pPIS->TextVPos)
|
||||||
{
|
{
|
||||||
@@ -355,11 +462,13 @@ DoPresentation (PVOID pIS)
|
|||||||
pPIS->TextLines[i].baseline.y = y;
|
pPIS->TextLines[i].baseline.y = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!pPIS->Batched)
|
||||||
LockMutex (GraphicsLock);
|
LockMutex (GraphicsLock);
|
||||||
SetContextClipping (TRUE);
|
SetContextClipping (TRUE);
|
||||||
for (i = 0; i < pPIS->LinesCount; ++i)
|
for (i = 0; i < pPIS->LinesCount; ++i)
|
||||||
DrawTracedText (pPIS->TextLines + i,
|
DrawTracedText (pPIS->TextLines + i,
|
||||||
pPIS->TextColor, pPIS->TextBackColor);
|
pPIS->TextColor, pPIS->TextBackColor);
|
||||||
|
if (!pPIS->Batched)
|
||||||
UnlockMutex (GraphicsLock);
|
UnlockMutex (GraphicsLock);
|
||||||
}
|
}
|
||||||
else if (strcmp (Opcode, "TFI") == 0)
|
else if (strcmp (Opcode, "TFI") == 0)
|
||||||
@@ -436,22 +545,92 @@ DoPresentation (PVOID pIS)
|
|||||||
UnbatchGraphics ();
|
UnbatchGraphics ();
|
||||||
UnlockMutex (GraphicsLock);
|
UnlockMutex (GraphicsLock);
|
||||||
}
|
}
|
||||||
|
else if (strcmp (Opcode, "SAVEBG") == 0)
|
||||||
|
{ /* save background */
|
||||||
|
TFB_DrawScreen_Copy (&pPIS->clip_r,
|
||||||
|
TFB_SCREEN_MAIN, TFB_SCREEN_EXTRA);
|
||||||
|
}
|
||||||
|
else if (strcmp (Opcode, "RESTBG") == 0)
|
||||||
|
{ /* restore background */
|
||||||
|
TFB_DrawScreen_Copy (&pPIS->clip_r,
|
||||||
|
TFB_SCREEN_EXTRA, TFB_SCREEN_MAIN);
|
||||||
|
}
|
||||||
else if (strcmp (Opcode, "DRAW") == 0)
|
else if (strcmp (Opcode, "DRAW") == 0)
|
||||||
{ /* draw a graphic */
|
{ /* draw a graphic */
|
||||||
int index;
|
#define PRES_DRAW_INDEX 0
|
||||||
if (1 == sscanf (pStr, "%d", &index))
|
#define PRES_DRAW_SIS 1
|
||||||
{
|
int cargs;
|
||||||
|
int draw_what;
|
||||||
|
int index, x, y, scale, angle;
|
||||||
|
char ImgName[16];
|
||||||
|
int OldScale;
|
||||||
STAMP s;
|
STAMP s;
|
||||||
|
|
||||||
|
if (1 == sscanf (pStr, "%15s", ImgName)
|
||||||
|
&& strcmp (strupr (ImgName), "SIS") == 0)
|
||||||
|
{
|
||||||
|
draw_what = PRES_DRAW_SIS;
|
||||||
|
cargs = sscanf (pStr, "%*s %d %d %d %d",
|
||||||
|
&x, &y, &scale, &angle) + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
draw_what = PRES_DRAW_INDEX;
|
||||||
|
cargs = sscanf (pStr, "%d %d %d %d %d",
|
||||||
|
&index, &x, &y, &scale, &angle);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cargs < 1)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Bad DRAW command '%s'\n", pStr);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (cargs < 5)
|
||||||
|
angle = 0;
|
||||||
|
if (cargs < 4)
|
||||||
|
scale = GSCALE_IDENTITY;
|
||||||
|
if (cargs < 3)
|
||||||
|
{
|
||||||
|
x = 0;
|
||||||
|
y = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (draw_what == PRES_DRAW_INDEX)
|
||||||
|
{ /* draw stamp by index */
|
||||||
s.frame = SetAbsFrameIndex (pPIS->Frame, (COUNT)index);
|
s.frame = SetAbsFrameIndex (pPIS->Frame, (COUNT)index);
|
||||||
s.origin.x = 0;
|
}
|
||||||
s.origin.y = 0;
|
else if (draw_what == PRES_DRAW_SIS)
|
||||||
|
{ /* draw dynamic SIS image with player's modules */
|
||||||
|
if (!pPIS->SisFrame)
|
||||||
|
Present_GenerateSIS (pPIS);
|
||||||
|
|
||||||
|
s.frame = SetAbsFrameIndex (pPIS->SisFrame, 0);
|
||||||
|
}
|
||||||
|
if (angle != 0)
|
||||||
|
{
|
||||||
|
if (angle != pPIS->LastAngle
|
||||||
|
|| draw_what != pPIS->LastDrawKind)
|
||||||
|
{
|
||||||
|
DestroyDrawable (ReleaseDrawable (pPIS->RotatedFrame));
|
||||||
|
pPIS->RotatedFrame = CaptureDrawable (
|
||||||
|
RotateFrame (s.frame, DEGREES_TO_ANGLE (angle)));
|
||||||
|
pPIS->LastAngle = angle;
|
||||||
|
pPIS->LastDrawKind = draw_what;
|
||||||
|
}
|
||||||
|
s.frame = pPIS->RotatedFrame;
|
||||||
|
}
|
||||||
|
s.origin.x = x;
|
||||||
|
s.origin.y = y;
|
||||||
|
if (!pPIS->Batched)
|
||||||
LockMutex (GraphicsLock);
|
LockMutex (GraphicsLock);
|
||||||
|
OldScale = GetGraphicScale ();
|
||||||
|
SetGraphicScale (scale);
|
||||||
SetContextClipping (TRUE);
|
SetContextClipping (TRUE);
|
||||||
DrawStamp (&s);
|
DrawStamp (&s);
|
||||||
|
SetGraphicScale (OldScale);
|
||||||
|
if (!pPIS->Batched)
|
||||||
UnlockMutex (GraphicsLock);
|
UnlockMutex (GraphicsLock);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else if (strcmp (Opcode, "BATCH") == 0)
|
else if (strcmp (Opcode, "BATCH") == 0)
|
||||||
{ /* batch graphics */
|
{ /* batch graphics */
|
||||||
Present_BatchGraphics (pPIS);
|
Present_BatchGraphics (pPIS);
|
||||||
@@ -538,7 +717,11 @@ ShowPresentation (const char *name)
|
|||||||
pis.InputFunc = DoPresentation;
|
pis.InputFunc = DoPresentation;
|
||||||
pis.Font = 0;
|
pis.Font = 0;
|
||||||
pis.Frame = 0;
|
pis.Frame = 0;
|
||||||
|
pis.RotatedFrame = 0;
|
||||||
|
pis.LastDrawKind = -1;
|
||||||
|
pis.LastAngle = 0;
|
||||||
pis.MusicRef = 0;
|
pis.MusicRef = 0;
|
||||||
|
pis.SisFrame = 0;
|
||||||
pis.Batched = FALSE;
|
pis.Batched = FALSE;
|
||||||
pis.TextVPos = 'B';
|
pis.TextVPos = 'B';
|
||||||
pis.LastSyncTime = pis.StartTime = GetTimeCounter ();
|
pis.LastSyncTime = pis.StartTime = GetTimeCounter ();
|
||||||
@@ -550,6 +733,7 @@ ShowPresentation (const char *name)
|
|||||||
FadeMusic (MAX_VOLUME, 0);
|
FadeMusic (MAX_VOLUME, 0);
|
||||||
|
|
||||||
DestroyMusic (pis.MusicRef);
|
DestroyMusic (pis.MusicRef);
|
||||||
|
DestroyDrawable (ReleaseDrawable (pis.RotatedFrame));
|
||||||
DestroyDrawable (ReleaseDrawable (pis.Frame));
|
DestroyDrawable (ReleaseDrawable (pis.Frame));
|
||||||
DestroyFont (ReleaseFont (pis.Font));
|
DestroyFont (ReleaseFont (pis.Font));
|
||||||
DestroyStringTable (ReleaseStringTable (pis.SlideShow));
|
DestroyStringTable (ReleaseStringTable (pis.SlideShow));
|
||||||
|
|||||||
Reference in New Issue
Block a user