Commit 3a4d1f62 authored by Steven Fuller's avatar Steven Fuller

* DisplayScreen in GL (uses DrawPixels)

* If LastTexture is same, don't do a new glBegin (for Walls)
parent f4482f23
......@@ -22,25 +22,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <stdlib.h>
#include <string.h>
unsigned char *VideoPointer;
Word VideoWidth;
LongWord YTable[480];
#define BRGR 0x42524752
void InitYTable(void)
{
Word i;
LongWord Offset;
i = 0;
Offset = 0;
do {
YTable[i] = Offset;
Offset+=VideoWidth;
} while (++i<480);
}
/**********************************
Load and set a palette resource
......
......@@ -45,6 +45,47 @@ Byte Pal[768];
Utility Functions
*/
GLuint LastTexture;
static void StartTexture()
{
LastTexture = -1;
}
static void ChangeTexture(GLuint x)
{
if (x == 0)
fprintf(stderr, "%s/%d: Binding zero texture!\n", __FILE__, __LINE__);
if (LastTexture != x) {
if (LastTexture != -1)
glEnd();
glBindTexture(GL_TEXTURE_2D, x);
glBegin(GL_QUADS);
LastTexture = x;
return;
}
}
static void StopTexture()
{
if (LastTexture != -1)
glEnd();
LastTexture = -1;
}
static void ChangeTextureSimple(GLuint x)
{
if (x == 0)
fprintf(stderr, "%s/%d: Binding zero texture!\n", __FILE__, __LINE__);
if (LastTexture != x) {
glBindTexture(GL_TEXTURE_2D, x);
LastTexture = x;
return;
}
}
void xgluPerspective(GLdouble fovx, GLdouble aspect, GLdouble zNear, GLdouble zFar)
{
GLdouble xmin, xmax, ymin, ymax;
......@@ -79,10 +120,6 @@ int CheckToken(const char *str, const char *item)
Temp Stuff
*/
void DisplayScreen(Word res)
{
}
void FadeToPtr(unsigned char *PalPtr)
{
SetPalette(PalPtr);
......@@ -136,10 +173,64 @@ Byte *Pal256toRGB(Byte *dat, int len, Byte *pal)
return buf;
}
typedef struct
{
GLuint t;
GLfloat w;
GLfloat h;
} Texture;
void RedrawScreen()
{
BlastScreen();
}
void DrawShape(Word x, Word y, void *ShapePtr)
{
}
void DrawPsyched(Word Index)
{
}
void DisplayScreen(Word res, Word pres)
{
LongWord *PackPtr;
LongWord PackLength;
unsigned short *ShapePtr;
int width, height;
Byte *buf, *pal;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
PackPtr = LoadAResource(res);
PackLength = lMSB(PackPtr[0]);
ShapePtr = (unsigned short *)AllocSomeMem(PackLength);
DLZSS((Byte *)ShapePtr, (Byte *)&PackPtr[1], PackLength);
pal = LoadAResource(pres);
glPixelZoom(1.0f, -1.0f);
glRasterPos2f(-1.0f, 1.0f);
width = sMSB(ShapePtr[0]);
height = sMSB(ShapePtr[1]);
buf = Pal256toRGB((Byte *)&ShapePtr[2], width * height, pal);
glDrawPixels(width, height, GL_RGB, GL_UNSIGNED_BYTE, buf);
free(buf);
FreeSomeMem(ShapePtr);
ReleaseAResource(pres);
ReleaseAResource(res);
glFinish();
}
void SetNumber(LongWord number, Word x, Word y, Word digits)
{
}
......@@ -205,7 +296,6 @@ void IO_DisplayViewBuffer(void)
}
}
GLuint LastTexture;
/*
Automap Drawing
......@@ -222,9 +312,7 @@ void MakeSmallFont()
buf = (Byte *)malloc(16 * 16);
pal = LoadAResource(rGamePal);
LastTexture = 0;
for (i = 0; i < 64; i++) {
ArtStart = ArtData[i];
......@@ -325,7 +413,6 @@ void DrawSmall(Word x, Word y, Word tile)
glPushMatrix();
glLoadIdentity();
LastTexture = smltex[tile];
glBindTexture(GL_TEXTURE_2D, smltex[tile]);
glBegin(GL_QUADS);
......@@ -484,11 +571,14 @@ Byte *DeXMShape256(Byte *data)
void IO_ClearViewBuffer()
{
LastTexture = 0;
StartTexture();
glBindTexture(GL_TEXTURE_2D, 0);
/* **MESA BUG** */
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glViewport(0, VidHeight - ViewHeight, VidWidth, ViewHeight);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
......@@ -496,41 +586,28 @@ void IO_ClearViewBuffer()
glPushMatrix();
glLoadIdentity();
#if 0
/* glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); */
glClear(GL_DEPTH_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);
glColor3ub(Pal[0x2F*3+0], Pal[0x2F*3+1], Pal[0x2F*3+2]);
glRectf(-1, 0, 1, 1);
glColor3ub(Pal[0x2A*3+0], Pal[0x2A*3+1], Pal[0x2A*3+2]);
glRectf(1, -1, -1, 0);
glEnable(GL_DEPTH_TEST);
#else
glEnable(GL_DEPTH_TEST);
glDepthRange(1.0, 1.0);
glDepthFunc(GL_ALWAYS);
glColor3ub(Pal[0x2F*3+0], Pal[0x2F*3+1], Pal[0x2F*3+2]);
glRectf(-1, 0, 1, 1);
glRectf(-1.0, 0.0, 1.0, 1.0);
glColor3ub(Pal[0x2A*3+0], Pal[0x2A*3+1], Pal[0x2A*3+2]);
glRectf(1, -1, -1, 0);
glRectf(1.0, -1.0, -1.0, 0.0);
glDepthRange(0.0, 1.0);
glDepthFunc(GL_LESS);
#endif
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
/* Not needed when using GL_REPLACE */
/* glColor3f(1.0, 1.0, 1.0); */
/* glColor3f(1.0, 1.0, 1.0); */
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glRotatef(270.0-((GLfloat)gamestate.viewangle / (GLfloat)ANGLES * 360.0), 0.0, 1.0, 0.0);
glTranslatef((GLfloat)actors[0].x / 256.0, 0, (GLfloat)actors[0].y / 256.0);
}
......@@ -544,9 +621,9 @@ void InitRenderView()
Byte *buf, *pal;
int i;
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
LastTexture = 0;
glEnable(GL_TEXTURE_2D);
#ifdef GL_EXT_shared_texture_palette
......@@ -695,8 +772,6 @@ void InitRenderView()
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5);
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
......@@ -711,7 +786,6 @@ void InitRenderView()
void IO_AttackShape(Word shape)
{
LastTexture = weptex[shape];
if (weptex[shape] == 0) {
fprintf(stderr, "Weapon shape %d is zero texture!\n", shape);
}
......@@ -748,14 +822,7 @@ void DrawSprite(thing_t *t)
glTranslatef(-(GLfloat)t->x / 256.0, 0, -(GLfloat)t->y / 256.0);
glRotatef(90.0+((GLfloat)gamestate.viewangle / (GLfloat)ANGLES * 360.0), 0.0, 1.0, 0.0);
if (sprtex[t->sprite] == 0) {
fprintf(stderr, "ERROR: 0 texture in DrawSprite (%d)\n", t->sprite);
}
if (LastTexture != sprtex[t->sprite]) {
LastTexture = sprtex[t->sprite];
glBindTexture(GL_TEXTURE_2D, sprtex[t->sprite]);
}
ChangeTextureSimple(sprtex[t->sprite]);
glBegin(GL_QUADS);
glTexCoord2f(1.0, 0.0); glVertex2f( 0.5, 1);
......@@ -763,7 +830,7 @@ void DrawSprite(thing_t *t)
glTexCoord2f(0.0, 1.0); glVertex2f(-0.5, -1);
glTexCoord2f(0.0, 0.0); glVertex2f(-0.5, 1);
glEnd();
glPopMatrix();
}
......@@ -994,6 +1061,8 @@ void DrawSprites(void)
missile_t *MissilePtr; /* Pointer to active missile record */
Word *xe; /* Pointer to sort value */
StopTexture(); /* Draw Walls */
numvisspr = 0; /* Init the sprite count */
/* add all sprites in visareas*/
......@@ -1039,14 +1108,13 @@ void DrawSprites(void)
SortEvents();
/* draw from smallest scale to largest */
xe = &firstevent[i-1];
do {
dseg = &vissprites[xe[0]&(MAXVISSPRITES-1)];
DrawSprite(dseg->pos);
--xe;
} while (--i);
}
}
}
static int WallSeen = 0;
......@@ -1300,15 +1368,8 @@ void P_DrawSegx(saveseg_t *seg)
smin = -(pos + texslide);
smax = -(pos + (max - min));
if (waltex[t] == 0)
fprintf(stderr, "ERROR: 0 texture in P_DrawSegx!\n");
if (LastTexture != waltex[t]) {
LastTexture = waltex[t];
glBindTexture(GL_TEXTURE_2D, waltex[t]);
}
ChangeTexture(waltex[t]);
glBegin(GL_QUADS);
switch(seg->dir&3) {
case di_north:
if (door != -1) {
......@@ -1359,6 +1420,5 @@ void P_DrawSegx(saveseg_t *seg)
}
break;
}
glEnd();
}
}
......@@ -243,8 +243,9 @@ void LevelCompleted(void)
NumberIndex = 47; /* Hack to draw score using an alternate number set */
NewGameWindow(1); /* Force 512 mode screen */
DisplayScreen(rIntermission);
DisplayScreen(rIntermission, rInterPal);
BlastScreen();
PackPtr = LoadAResource(rInterPics);
PackLength = lMSB(PackPtr[0]);
BJPtr = (Byte *)AllocSomeMem(PackLength);
......
......@@ -32,19 +32,23 @@ void Intro(void)
FadeToBlack(); /* Fade out the video */
DisplayScreen(rMacPlayPic);
DisplayScreen(rMacPlayPic, rMacPlayPal);
BlastScreen();
StartSong(SongListPtr[0]); /* Play the song */
FadeTo(rMacPlayPal); /* Fade in the picture */
WaitTicksEvent(240); /* Wait for event */
DisplayScreen(rMacPlayPic, rIdLogoPal); /* higher bpp hack */
BlastScreen();
FadeTo(rIdLogoPal);
if (toupper(WaitTicksEvent(240))=='B') { /* Wait for event */
FadeToBlack();
ClearTheScreen(BLACK);
DisplayScreen(rYummyPic);
DisplayScreen(rYummyPic, rYummyPal);
BlastScreen();
FadeTo(rYummyPal);
......
......@@ -137,7 +137,7 @@ Boolean TitleScreen()
NewGameWindow(1); /* Set to 512 mode */
FadeToBlack(); /* Fade out the video */
DisplayScreen(rTitlePic);
DisplayScreen(rTitlePic, rTitlePal);
BlastScreen();
StartSong(SongListPtr[0]);
......
......@@ -10,7 +10,7 @@ This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
......@@ -19,12 +19,31 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "wolfdef.h"
void DisplayScreen(Word res)
unsigned char *VideoPointer;
Word VideoWidth;
LongWord YTable[480];
void InitYTable(void)
{
Word i;
LongWord Offset;
i = 0;
Offset = 0;
do {
YTable[i] = Offset;
Offset+=VideoWidth;
} while (++i<480);
}
void DisplayScreen(Word res, Word pal)
{
LongWord *PackPtr;
LongWord PackLength;
unsigned short *ShapePtr;
/* pal is ignored in 8bit */
PackPtr = LoadAResource(res);
PackLength = lMSB(PackPtr[0]);
ShapePtr = (unsigned short *)AllocSomeMem(PackLength);
......@@ -35,6 +54,15 @@ void DisplayScreen(Word res)
ReleaseAResource(res);
}
void RedrawScreen()
{
BlastScreen();
}
void DrawPsyched(Word Index)
{
}
/**********************************
Load and set a palette from a pointer
......
......@@ -13,16 +13,16 @@ TODO:
* Finish moving all 2D code to SoftDraw.c
- Should move some code so it is not such a large file (SoftDraw2.c)
* Finish OpenGL
+ Status bars, Introscreens, Psyched [DrawShape]
+ Not exactly sure how I will implement this yet.
- IO_Draw* (status bar versions) are stubbed, update statusbar when
doing screen update
+ Status bars, Level completed screen, Psyched [DrawShape]
- IO_Draw* (status bar versions) are stubbed, update statusbar when
doing screen update
- Finish window resizing
- Could use the LastTexture to have less glBegin/Ends.
- When all drawing is implemented, remove any unnecessary state/matrix
changes.
- Split up GLDraw.c
- Is GL_REPLACE faster than GL_MODULATE for textures?
- Save "draw state" so redrawing works right when screen is
resized/exposed
* Save/Load Games
- Menu code does not exist yet -- so just have a compiled in default save
and load files
......
......@@ -107,11 +107,6 @@ void ShowGetPsyched(void)
SetAPalette(rGamePal);
}
void DrawPsyched(Word Index)
{
/* TODO: blah */
}
void EndGetPsyched(void)
{
while (PsyTime > ReadTick()) ;
......
......@@ -40,6 +40,8 @@ XVisualInfo *vi;
GLXContext ctx;
Atom wmDeleteWindow;
int VidWidth, VidHeight, ViewHeight;
#ifdef GL_EXT_shared_texture_palette
extern int UseSharedTexturePalette;
extern PFNGLCOLORTABLEEXTPROC pglColorTableEXT;
......@@ -47,6 +49,8 @@ extern PFNGLCOLORTABLEEXTPROC pglColorTableEXT;
extern int CheckToken(const char *str, const char *item);
int HandleEvents();
int attrib[] = {
GLX_RGBA,
GLX_RED_SIZE, 5,
......@@ -189,6 +193,8 @@ int main(int argc, char *argv[])
}
#endif
glShadeModel(GL_FLAT);
InitData();
SlowDown = 1;
......@@ -222,7 +228,6 @@ void BlastScreen2(Rect *BlastRect)
BlastScreen();
}
int VidWidth, VidHeight, ViewHeight;
#define w VidWidth
#define h VidHeight
#define v ViewHeight
......@@ -243,7 +248,7 @@ void BlastScreen()
}
}
Word VidXs[] = {320,512,640,640}; /* Screen sizes to play with */
Word VidXs[] = {320,512,640,640};
Word VidYs[] = {200,384,400,480};
Word VidVs[] = {160,320,320,400};
Word VidPics[] = {rFaceShapes,rFace512,rFace640,rFace640};
......@@ -270,15 +275,18 @@ Word NewGameWindow(Word NewVidSize)
sizehints.flags = PMinSize;
XSetWMNormalHints(dpy, win, &sizehints);
XResizeWindow(dpy, win, w, h);
XSync(dpy, False);
InitYTable();
SetAPalette(rBlackPal);
ClearTheScreen(BLACK);
BlastScreen();
VidSize = NewVidSize;
XSync(dpy, False);
glXWaitGL();
glXWaitX();
HandleEvents();
return VidSize;
}
......@@ -412,6 +420,15 @@ void keyboard_handler(KeySym keycode, int press)
UpdateKeys(keycode, press);
if (press == 0) {
switch(keycode) {
case XK_Escape:
Quit(NULL); /* fast way out */
default:
break;
}
}
if (RSJ) {
if (press == 0) {
for (i = 0; i < CheatCount; i++) {
......@@ -505,9 +522,7 @@ void keyboard_handler(KeySym keycode, int press)
case XK_period:
case XK_slash:
joystick1 = JOYPAD_START;
break;
case XK_Escape:
Quit(NULL); /* fast way out */
break;
}
}
......@@ -558,23 +573,22 @@ void keyboard_handler(KeySym keycode, int press)
joystick1 |= (JOYPAD_X|JOYPAD_Y);
if (keys[SC_RIGHTSHIFT])
joystick1 |= (JOYPAD_X|JOYPAD_Y);
}
if ((joystick1 & (JOYPAD_LFT|JOYPAD_RGT)) == (JOYPAD_LFT|JOYPAD_RGT))
joystick1 &= ~(JOYPAD_LFT|JOYPAD_RGT);
if ((joystick1 & (JOYPAD_UP|JOYPAD_DN)) == (JOYPAD_UP|JOYPAD_DN))
joystick1 &= ~(JOYPAD_UP|JOYPAD_DN);
if (joystick1 & JOYPAD_TR) {
if (joystick1 & JOYPAD_LFT) {
joystick1 = (joystick1 & ~(JOYPAD_TR|JOYPAD_LFT)) | JOYPAD_TL;
} else if (joystick1 & JOYPAD_RGT) {
joystick1 = joystick1 & ~JOYPAD_RGT;
} else {
joystick1 &= ~JOYPAD_TR;
if ((joystick1 & (JOYPAD_LFT|JOYPAD_RGT)) == (JOYPAD_LFT|JOYPAD_RGT))
joystick1 &= ~(JOYPAD_LFT|JOYPAD_RGT);
if ((joystick1 & (JOYPAD_UP|JOYPAD_DN)) == (JOYPAD_UP|JOYPAD_DN))
joystick1 &= ~(JOYPAD_UP|JOYPAD_DN);
if (joystick1 & JOYPAD_TR) {
if (joystick1 & JOYPAD_LFT) {
joystick1 = (joystick1 & ~(JOYPAD_TR|JOYPAD_LFT)) | JOYPAD_TL;
} else if (joystick1 & JOYPAD_RGT) {
joystick1 = joystick1 & ~JOYPAD_RGT;
} else {
joystick1 &= ~JOYPAD_TR;
}
}
}
}
int HandleEvents()
......@@ -595,10 +609,12 @@ int HandleEvents()
ret = 0;
break;
case Expose:
BlastScreen();
RedrawScreen();
break;
case ConfigureNotify:
glViewport(0, 0, event.xconfigure.width, event.xconfigure.height);
glPixelZoom(1.0f, -1.0f);
glRasterPos2f(-1.0f, 1.0f);
break;
case ClientMessage:
if (event.xclient.data.l[0] == wmDeleteWindow)
......
......@@ -585,7 +585,7 @@ extern Byte *ArtData[64];
extern Byte textures[MAPSIZE*2+5][MAPSIZE]; /* 0-63 is horizontal, 64-127 is vertical*/
extern void SetPalette(Byte *pal);
extern void DisplayScreen(Word res);
extern void DisplayScreen(Word res, Word pal);
extern void InitRenderView();
extern void StartRenderView();
extern void Quit(char *str);
......@@ -594,6 +594,7 @@ extern int InitResources(char *name);
extern void InitData();
extern int WolfMain(int argc, char *argv[]);
extern void FreeResources();
extern void RedrawScreen();
extern void BlastScreen(void);
extern void BlastScreen2(Rect *BlastRect);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment