// called by GOS when you need to draw //--------------------------------------------------------------------------- void __stdcall UpdateRenderers() { uint32_t bColor = 0x0; gos_SetupViewport(1, 1.0, 1, bColor, 0.0, 0.0, 1.0, 1.0); //ALWAYS FULL SCREEN for now gos_SetRenderState(gos_State_Filter, gos_FilterBiLinear); gos_SetRenderState(gos_State_AlphaMode, gos_Alpha_AlphaInvAlpha); gos_SetRenderState(gos_State_AlphaTest, TRUE); gos_SetRenderState(gos_State_Clipping, TRUE); gos_SetRenderState(gos_State_TextureAddress, gos_TextureClamp); gos_SetRenderState(gos_State_Dither, 1); float viewMulX, viewMulY, viewAddX, viewAddY; gos_GetViewport(&viewMulX, &viewMulY, &viewAddX, &viewAddY); //------------------------------------------------------------ gos_SetRenderState(gos_State_Filter, gos_FilterNone); pMechlopedia->render(); gos_SetRenderState(gos_State_Filter, gos_FilterNone); userInput->setViewport(viewMulX, viewMulY, viewAddX, viewAddY); userInput->render(); }
void UpdateRenderers() { hasGuardBand = gos_GetMachineInformation(gos_Info_HasGuardBandClipping) != 0; //--------------------------------------------------------------------------------- //Doesn't work. Always returns 0 for TNT in Win2K build 2183 with 3.55 detonator //Assume worst case is +/- 8.0 for now. //MaxMinUV = gos_GetMachineInformation(gos_Info_GetMaximumUVSize); DWORD bColor = 0x0; if (eye) bColor = eye->fogColor; gos_SetupViewport(1,1.0,1,bColor, 0.0, 0.0, 1.0, 1.0 ); //ALWAYS FULL SCREEN for now gos_SetRenderState( gos_State_Filter, gos_FilterBiLinear ); gos_SetRenderState( gos_State_AlphaMode, gos_Alpha_AlphaInvAlpha ); gos_SetRenderState( gos_State_AlphaTest, TRUE ); gos_SetRenderState( gos_State_Clipping, TRUE); gos_SetRenderState( gos_State_TextureAddress, gos_TextureClamp ); gos_SetRenderState( gos_State_Dither, 1); if (logistics) { float viewMulX, viewMulY, viewAddX, viewAddY; gos_GetViewport(&viewMulX, &viewMulY, &viewAddX, &viewAddY); //userInput->setViewport(viewMulX,viewMulY,viewAddX,viewAddY); logistics->render(); } //------------------------------------------------------------ gos_SetRenderState( gos_State_Filter, gos_FilterNone ); //userInput->render(); //------------------------------------------------------------ gos_SetRenderState( gos_State_Filter, gos_FilterNone ); }
//--------------------------------------------------------------------------- void GameCamera::render(void) { //------------------------------------------------------ // At present, these actually draw. Later they will // add elements to the draw list and sort and draw. // The later time has arrived. We begin sorting immediately. // NO LONGER NEED TO SORT! // ZBuffer time has arrived. Share and Enjoy! // Everything SIMPLY draws at the execution point into the zBuffer // at the correct depth. Miracles occur at that point! // Big code change but it removes a WHOLE bunch of code and memory! //-------------------------------------------------------- // Get new viewport values to scale stuff. No longer uses // VFX stuff for this. ALL GOS NOW! gos_GetViewport(&viewMulX, &viewMulY, &viewAddX, &viewAddY); MidLevelRenderer::MLRState default_state; default_state.SetBackFaceOn(); default_state.SetDitherOn(); default_state.SetTextureCorrectionOn(); default_state.SetZBufferCompareOn(); default_state.SetZBufferWriteOn(); default_state.SetFilterMode(MidLevelRenderer::MLRState::BiLinearFilterMode); float z = 1.0f; Stuff::RGBAColor fColor; fColor.red = ((fogColor >> 16) & 0xff); fColor.green = ((fogColor >> 8) & 0xff); fColor.blue = ((fogColor)&0xff); //-------------------------------------------------------- // Get new viewport values to scale stuff. No longer uses // VFX stuff for this. ALL GOS NOW! screenResolution.x = viewMulX; screenResolution.y = viewMulY; calculateProjectionConstants(); TG_Shape::SetViewport(viewMulX, viewMulY, viewAddX, viewAddY); userInput->setViewport(viewMulX, viewMulY, viewAddX, viewAddY); gos_TextSetRegion(viewAddX, viewAddY, viewMulX, viewMulY); //-------------------------------------------------------- // Get new viewport values to scale stuff. No longer uses // VFX stuff for this. ALL GOS NOW! screenResolution.x = viewMulX; screenResolution.y = viewMulY; calculateProjectionConstants(); globalScaleFactor = getScaleFactor(); globalScaleFactor *= viewMulX / 640.0; // Scale Mechs to ScreenRES //----------------------------------------------- // Set Ambient for this pass of rendering uint32_t lightRGB = (ambientRed << 16) + (ambientGreen << 8) + ambientBlue; eye->setLightColor(1, lightRGB); eye->setLightIntensity(1, 1.0); MidLevelRenderer::PerspectiveMode = usePerspective; theClipper->StartDraw(cameraOrigin, cameraToClip, fColor, &fColor, default_state, &z); MidLevelRenderer::GOSVertex::farClipReciprocal = (1.0f - cameraToClip(2, 2)) / cameraToClip(3, 2); if (active && turn > 1) { //---------------------------------------------------------- // Turn stuff on line by line until perspective is working. if (Environment.Renderer != 3) theSky->render(1); land->render(); // render the Terrain if (Environment.Renderer != 3) craterManager->render(); // render the craters and footprints ObjectManager->render(true, true, true); // render all other objects land->renderWater(); // Draw Water Last! if (useShadows && Environment.Renderer != 3) ObjectManager->renderShadows(true, true, true); if (mission && mission->missionInterface) mission->missionInterface->drawVTOL(); if (!drawOldWay && !inMovieMode) { if (compass && (turn > 3) && drawCompass) compass->render(-1); // Force this to zBuffer in front of everything } if (!drawOldWay) mcTextureManager->renderLists(); // This sends triangles down to the // card. All "rendering" to this // point has been setting up tri // lists if (drawOldWay) { // Last thing drawn were shadows which are not Gouraud Shaded!!! // MLR to be "efficient" doesn't set this state by default at // startup! gos_SetRenderState(gos_State_ShadeMode, gos_ShadeGouraud); } theClipper->RenderNow(); // Draw the FX if (useNonWeaponEffects) weather->render(); // Draw the weather } if (drawOldWay && !inMovieMode) { gos_SetRenderState(gos_State_ZCompare, 0); gos_SetRenderState(gos_State_ZWrite, 0); gos_SetRenderState(gos_State_Perspective, 1); if (compass && (turn > 3) && drawCompass) compass->render(); } //--------------------------------------------------------- // Check if we are inMovieMode and should be letterboxed. // draw letterboxes here. if (inMovieMode && (letterBoxPos != 0.0f)) { // Figure out the two faces we need to draw based on letterBox Pos and // Alpha float barTopX = screenResolution.y * letterBoxPos; float barBotX = screenResolution.y - barTopX; gos_SetRenderState(gos_State_AlphaMode, gos_Alpha_AlphaInvAlpha); gos_SetRenderState(gos_State_ShadeMode, gos_ShadeGouraud); gos_SetRenderState(gos_State_MonoEnable, 0); gos_SetRenderState(gos_State_Perspective, 0); gos_SetRenderState(gos_State_Clipping, 1); gos_SetRenderState(gos_State_AlphaTest, 1); gos_SetRenderState(gos_State_Specular, 0); gos_SetRenderState(gos_State_Dither, 1); gos_SetRenderState(gos_State_TextureMapBlend, gos_BlendModulate); gos_SetRenderState(gos_State_Filter, gos_FilterNone); gos_SetRenderState(gos_State_TextureAddress, gos_TextureClamp); gos_SetRenderState(gos_State_ZCompare, 0); gos_SetRenderState(gos_State_ZWrite, 0); gos_SetRenderState(gos_State_Texture, 0); //------------------------------------ gos_VERTEX gVertex[4]; gVertex[0].x = 0.0f; gVertex[0].y = 0.0f; gVertex[0].z = 0.00001f; gVertex[0].rhw = 0.00001f; gVertex[0].u = 0.0f; gVertex[0].v = 0.0f; gVertex[0].argb = (letterBoxAlpha << 24); gVertex[0].frgb = 0xff000000; gVertex[1].x = 0.0f; gVertex[1].y = barTopX; gVertex[1].z = 0.00001f; gVertex[1].rhw = 0.00001f; gVertex[1].u = 0.0f; gVertex[1].v = 0.0f; gVertex[1].argb = (letterBoxAlpha << 24); gVertex[1].frgb = 0xff000000; gVertex[2].x = screenResolution.x; gVertex[2].y = barTopX; gVertex[2].z = 0.00001f; gVertex[2].rhw = 0.00001f; gVertex[2].u = 0.0f; gVertex[2].v = 0.0f; gVertex[2].argb = (letterBoxAlpha << 24); gVertex[2].frgb = 0xff000000; gVertex[3].x = screenResolution.x; gVertex[3].y = 0.0f; gVertex[3].z = 0.00001f; gVertex[3].rhw = 0.00001f; gVertex[3].u = 0.0f; gVertex[3].v = 0.0f; gVertex[3].argb = (letterBoxAlpha << 24); gVertex[3].frgb = 0xff000000; gos_DrawQuads(gVertex, 4); gVertex[0].x = 0.0f; gVertex[0].y = barBotX; gVertex[0].z = 0.00001f; gVertex[0].rhw = 0.00001f; gVertex[0].u = 0.0f; gVertex[0].v = 0.0f; gVertex[0].argb = (letterBoxAlpha << 24); gVertex[0].frgb = 0xff000000; gVertex[1].x = screenResolution.x; gVertex[1].y = barBotX; gVertex[1].z = 0.00001f; gVertex[1].rhw = 0.00001f; gVertex[1].u = 0.0f; gVertex[1].v = 0.0f; gVertex[1].argb = (letterBoxAlpha << 24); gVertex[1].frgb = 0xff000000; gVertex[2].x = screenResolution.x; gVertex[2].y = screenResolution.y; gVertex[2].z = 0.00001f; gVertex[2].rhw = 0.00001f; gVertex[2].u = 0.0f; gVertex[2].v = 0.0f; gVertex[2].argb = (letterBoxAlpha << 24); gVertex[2].frgb = 0xff000000; gVertex[3].x = 0.0f; gVertex[3].y = screenResolution.y; gVertex[3].z = 0.00001f; gVertex[3].rhw = 0.00001f; gVertex[3].u = 0.0f; gVertex[3].v = 0.0f; gVertex[3].argb = (letterBoxAlpha << 24); gVertex[3].frgb = 0xff000000; gos_DrawQuads(gVertex, 4); } if (inMovieMode && (fadeAlpha != 0x0)) { // We are fading to something other then clear screen. gos_SetRenderState(gos_State_AlphaMode, gos_Alpha_AlphaInvAlpha); gos_SetRenderState(gos_State_ShadeMode, gos_ShadeGouraud); gos_SetRenderState(gos_State_MonoEnable, 0); gos_SetRenderState(gos_State_Perspective, 0); gos_SetRenderState(gos_State_Clipping, 1); gos_SetRenderState(gos_State_AlphaTest, 1); gos_SetRenderState(gos_State_Specular, 0); gos_SetRenderState(gos_State_Dither, 1); gos_SetRenderState(gos_State_TextureMapBlend, gos_BlendModulate); gos_SetRenderState(gos_State_Filter, gos_FilterNone); gos_SetRenderState(gos_State_TextureAddress, gos_TextureClamp); gos_SetRenderState(gos_State_ZCompare, 0); gos_SetRenderState(gos_State_ZWrite, 0); gos_SetRenderState(gos_State_Texture, 0); //------------------------------------ gos_VERTEX gVertex[4]; gVertex[0].x = 0.0f; gVertex[0].y = 0.0f; gVertex[0].z = 0.00001f; gVertex[0].rhw = 0.00001f; gVertex[0].u = 0.0f; gVertex[0].v = 0.0f; gVertex[0].argb = (fadeAlpha << 24) + (fadeColor & 0x00ffffff); gVertex[0].frgb = 0xff000000; gVertex[1].x = 0.0f; gVertex[1].y = screenResolution.y; gVertex[1].z = 0.00001f; gVertex[1].rhw = 0.00001f; gVertex[1].u = 0.0f; gVertex[1].v = 0.0f; gVertex[1].argb = (fadeAlpha << 24) + (fadeColor & 0x00ffffff); gVertex[1].frgb = 0xff000000; gVertex[2].x = screenResolution.x; gVertex[2].y = screenResolution.y; gVertex[2].z = 0.00001f; gVertex[2].rhw = 0.00001f; gVertex[2].u = 0.0f; gVertex[2].v = 0.0f; gVertex[2].argb = (fadeAlpha << 24) + (fadeColor & 0x00ffffff); gVertex[2].frgb = 0xff000000; gVertex[3].x = screenResolution.x; gVertex[3].y = 0.0f; gVertex[3].z = 0.00001f; gVertex[3].rhw = 0.00001f; gVertex[3].u = 0.0f; gVertex[3].v = 0.0f; gVertex[3].argb = (fadeAlpha << 24) + (fadeColor & 0x00ffffff); gVertex[3].frgb = 0xff000000; gos_DrawQuads(gVertex, 4); } //----------------------------------------------------- }