void hrDrawBackground(void) { rndClearToBlack(); if (hrBackgroundTexture) { real32 x = -((real32)hrBackXSize / (real32)MAIN_WindowWidth); real32 y = -((real32)hrBackYSize / (real32)MAIN_WindowHeight); GLfloat v[8], t[8]; sdword oldTex = rndTextureEnable(TRUE); udword oldMode = rndTextureEnvironment(RTE_Replace); bool cull = glIsEnabled(GL_CULL_FACE) ? TRUE : FALSE; bool blend = glIsEnabled(GL_BLEND) ? TRUE : FALSE; glDisable(GL_CULL_FACE); glEnable(GL_BLEND); trClearCurrent(); glBindTexture(GL_TEXTURE_2D, hrBackgroundTexture); t[0] = 0.0f; t[1] = 0.0f; t[2] = hrBackXFrac; t[3] = 0.0f; t[4] = 0.0f; t[5] = hrBackYFrac; t[6] = hrBackXFrac; t[7] = hrBackYFrac; v[0] = primScreenToGLX(hrScaleMissionLoadingScreens ? feResRepositionScaledX(0) : feResRepositionCentredX(0)); v[1] = primScreenToGLY(hrScaleMissionLoadingScreens ? feResRepositionScaledY(0) : feResRepositionCentredY(0)); v[2] = primScreenToGLX(hrScaleMissionLoadingScreens ? feResRepositionScaledX(640) : feResRepositionCentredX(640)); v[3] = primScreenToGLY(hrScaleMissionLoadingScreens ? feResRepositionScaledY(0) : feResRepositionCentredY(0)); v[4] = primScreenToGLX(hrScaleMissionLoadingScreens ? feResRepositionScaledX(0) : feResRepositionCentredX(0)); v[5] = primScreenToGLY(hrScaleMissionLoadingScreens ? feResRepositionScaledY(480) : feResRepositionCentredY(480)); v[6] = primScreenToGLX(hrScaleMissionLoadingScreens ? feResRepositionScaledX(640) : feResRepositionCentredX(640)); v[7] = primScreenToGLY(hrScaleMissionLoadingScreens ? feResRepositionScaledY(480) : feResRepositionCentredY(480)); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, 0, t); glVertexPointer(2, GL_FLOAT, 0, v); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); rndTextureEnvironment(oldMode); rndTextureEnable(oldTex); if (cull) glEnable(GL_CULL_FACE); if (!blend) glDisable(GL_BLEND); } }
void hrDrawBackground(void) { real32 x, y; rndClearToBlack(); // Draw the cached background bitmap using glDrawPixels if (hrBackgroundImage) { x = -((real32)hrBackXSize / (real32)MAIN_WindowWidth); y = -((real32)hrBackYSize / (real32)MAIN_WindowHeight); rndTextureEnable(FALSE); rndLightingEnable(FALSE); glDisable(GL_BLEND); glDisable(GL_DEPTH_TEST); glRasterPos2f(x, y); if (hrDrawPixelsSupported()) { glDrawPixels(hrBackXSize, hrBackYSize, GL_RGBA, GL_UNSIGNED_BYTE, hrBackgroundImage); } } }
void horseRaceRender() { SDL_Event e; regRenderEventIndex = 0; //special-case code for double-clicks /* if (keyIsHit(LMOUSE_DOUBLE)) { keyPressUp(LMOUSE_DOUBLE); utyDoubleClick(); } if (demDemoRecording) { memcpy((ubyte *)&keyScanCode[0], (ubyte *)&keySaveScan[0], sizeof(keyScanCode));//freeze a snapshot of the key state demStateSave(); } else if (demDemoPlaying) { demStateLoad(); }*/ if (hrBackgroundReinit) { if (hrBackgroundTexture != 0) { glDeleteTextures(1, &hrBackgroundTexture); hrBackgroundTexture = 0; } hrBackgroundReinit = FALSE; hrBackgroundDirty = 3; hrBackgroundInitFrame = 0; } // Make sure the Homeworld text gets drawn on the correct frames if (hrBackgroundDirty) { regRecursiveSetDirty(&horseCrapRegion); hrDecRegion = NULL; } else { regionhandle reg; // "Clean" the region with the homeworld logo // in it so it doesn't re-draw all the time reg = horseCrapRegion.child; if (reg) { reg = reg->child; } while (reg && reg->drawFunction != &ferDrawDecorative) { reg = reg->next; } if (reg) { void regNULLRenderFunction(regionhandle region); hrDecRegion = reg; reg->drawFunction = regNULLRenderFunction; } } if (TitanActive) titanPumpEngine(); SDL_Delay(0); if (!SDL_PollEvent(0)) { regProcessingRegions = TRUE; regRegionProcess(horseCrapRegion.child, 0xffffffff); regProcessingRegions = FALSE; if (ChatTextEntryBox!=NULL) { bitSet(ChatTextEntryBox->reg.status,RSF_KeyCapture); keyBufferClear(); } } else { regRegionProcess(horseCrapRegion.child, 0xffffffff); while (SDL_PollEvent(0)) { if (SDL_WaitEvent(&e)) { HandleEvent(&e); if (multiPlayerGame) { if (keyIsStuck(ESCKEY)) { keyClearSticky(ESCKEY); //clear the sticky bit if (!hrAbortLoadConfirm) { if (!hrAbortLoadingGame) // if not already aborting { hrAbortLoadConfirm = feScreenStart(&horseCrapRegion, "AbortLoadConfirm"); } } else { feScreenDelete(hrAbortLoadConfirm); hrAbortLoadConfirm = NULL; } } } regProcessingRegions = TRUE; if (hrAbortLoadConfirm!=NULL) { ; } else if (ChatTextEntryBox!=NULL) { regRegionProcess(&ChatTextEntryBox->reg, 0xffffffff); } regProcessingRegions = FALSE; } if (ChatTextEntryBox!=NULL) { bitSet(ChatTextEntryBox->reg.status,RSF_KeyCapture); keyBufferClear(); } if (TitanActive) titanPumpEngine(); SDL_Delay(0); } } // All of the hacked stuff from the render task //glColor3ub(colRed(RND_StarColor), colGreen(RND_StarColor), colBlue(RND_StarColor)); if (ShouldHaveMousePtr) { if (!feShouldSaveMouseCursor()) { rndClearToBlack(); glClear(GL_DEPTH_BUFFER_BIT); } } // primErrorMessagePrint(); //default rendering scheme is primitives on any //functions which want it off should set it back on when done // I know this looks weird, but it's correct if(hrBackgroundInitFrame == 1) { hrInitBackground(); } // When there's no background loaded yet, it fills the screen with black if (hrBackgroundDirty) { hrDrawBackground(); } else { if (hrBackgroundTexture != 0) { glDeleteTextures(1, &hrBackgroundTexture); hrBackgroundTexture = 0; } } regFunctionsDraw(); //render all regions primErrorMessagePrint(); hrUncleanDecorative(); // We want the init code to be called on the 2nd pass. That way, the screen erases, // Then we incur the delay of loading the background. // For two frames -after that- we'll draw the background, // then just draw the progress bars. if(hrBackgroundDirty && hrBackgroundInitFrame) { if (hrBackgroundDirty > 0) { hrBackgroundDirty--; } } hrBackgroundInitFrame++; if (ShouldHaveMousePtr) { // set the cursor type, reset the variables then draw the mouse cursor mouseSelectCursorSetting(); mouseSetCursorSetting(); if (feShouldSaveMouseCursor()) { mouseStoreCursorUnder(); } mousePoll(); mouseDraw(); //draw mouse atop everything if (demDemoPlaying) { rndShamelessPlug(); } } rndFlush(); if (ShouldHaveMousePtr) { if (feShouldSaveMouseCursor()) { mouseRestoreCursorUnder(); } } primErrorMessagePrint(); }