static void CacheSideTextures (int nSeg) { short nSide, tMap1, tMap2; CBitmap* bmP, * bm2, * bmm; CSide* sideP; for (nSide = 0; nSide < MAX_SIDES_PER_SEGMENT; nSide++) { sideP = SEGMENTS [nSeg].m_sides + nSide; tMap1 = sideP->m_nBaseTex; if ((tMap1 < 0) || (tMap1 >= gameData.pig.tex.nTextures [gameStates.app.bD1Data])) continue; bmP = LoadFaceBitmap (tMap1, sideP->m_nFrame, bLoadTextures); if ((tMap2 = sideP->m_nOvlTex)) { bm2 = LoadFaceBitmap (tMap1, sideP->m_nFrame, bLoadTextures); bm2->SetTranspType (3); if (/*!(bm2->Flags () & BM_FLAG_SUPER_TRANSPARENT) ||*/ gameOpts->ogl.bGlTexMerge) bm2->SetupTexture (1, bLoadTextures); else if ((bmm = TexMergeGetCachedBitmap (tMap1, tMap2, sideP->m_nOvlOrient))) bmP = bmm; else bm2->SetupTexture (1, bLoadTextures); } bmP->SetTranspType (3); bmP->SetupTexture (1, bLoadTextures); } }
void LoadFaceBitmaps (CSegment *segP, CSegFace *faceP) { CSide *sideP = segP->m_sides + faceP->nSide; short nFrame = sideP->m_nFrame; if (faceP->nCamera >= 0) { if (SetupMonitorFace (faceP->nSegment, faceP->nSide, faceP->nCamera, faceP)) return; faceP->nCamera = -1; } #if DBG if (FACE_IDX (faceP) == nDbgFace) nDbgFace = nDbgFace; if ((faceP->nSegment == nDbgSeg) && ((nDbgSide < 0) || (faceP->nSide == nDbgSide))) nDbgSeg = nDbgSeg; #endif if ((faceP->nBaseTex < 0) || !faceP->bTextured) return; if (faceP->bOverlay) faceP->nBaseTex = sideP->m_nOvlTex; else { faceP->nBaseTex = sideP->m_nBaseTex; if (!faceP->bSplit) faceP->nOvlTex = sideP->m_nOvlTex; } if (gameOpts->ogl.bGlTexMerge) { faceP->bmBot = LoadFaceBitmap (faceP->nBaseTex, nFrame); if (nFrame) nFrame = nFrame; if (faceP->nOvlTex) faceP->bmTop = LoadFaceBitmap ((short) (faceP->nOvlTex), nFrame); else faceP->bmTop = NULL; } else { if (faceP->nOvlTex != 0) { faceP->bmBot = TexMergeGetCachedBitmap (faceP->nBaseTex, faceP->nOvlTex, faceP->nOvlOrient); if (faceP->bmBot) faceP->bmBot->SetupTexture (1, 1); #if DBG else faceP->bmBot = TexMergeGetCachedBitmap (faceP->nBaseTex, faceP->nOvlTex, faceP->nOvlOrient); #endif faceP->bmTop = NULL; } else { faceP->bmBot = gameData.pig.tex.bitmapP + gameData.pig.tex.bmIndexP [faceP->nBaseTex].index; LoadBitmap (gameData.pig.tex.bmIndexP [faceP->nBaseTex].index, gameStates.app.bD1Mission); } } }
CBitmap* CSegment::ChangeTextures (short nBaseTex, short nOvlTex) { CBitmap* bmBot = (nBaseTex < 0) ? NULL : LoadFaceBitmap (nBaseTex, 0, 1); CBitmap* bmTop = (nOvlTex <= 0) ? NULL : LoadFaceBitmap (nOvlTex, 0, 1); tSegFaces* segFaceP = SEGFACES + Index (); CSegFace * faceP = segFaceP->faceP; for (int i = segFaceP->nFaces; i; i--, faceP++) { if (bmBot) { faceP->bmBot = bmBot; faceP->nBaseTex = nBaseTex; } if (nOvlTex >= 0) { faceP->bmTop = bmTop; faceP->nOvlTex = nOvlTex; } } return bmBot ? bmBot : bmTop; }
int PixelTranspType (short nTexture, short nOrient, short nFrame, fix u, fix v) { CBitmap *bmP; int bmx, bmy, w, h, offs; ubyte c; #if 0 tBitmapIndex *bmiP; bmiP = gameData.pig.tex.bmIndexP + (nTexture); LoadBitmap (*bmiP, gameStates.app.bD1Data); bmP = BmOverride (gameData.pig.tex.bitmapP + bmiP->index); #else bmP = LoadFaceBitmap (nTexture, nFrame); if (!bmP->Buffer ()) return 0; #endif if (bmP->Flags () & BM_FLAG_RLE) bmP = rle_expand_texture (bmP); w = bmP->Width (); h = ((bmP->Type () == BM_TYPE_ALT) && bmP->Frames ()) ? w : bmP->Height (); if (nOrient == 0) { bmx = ((unsigned) X2I (u * w)) % w; bmy = ((unsigned) X2I (v * h)) % h; } else if (nOrient == 1) { bmx = ((unsigned) X2I ((I2X (1) - v) * w)) % w; bmy = ((unsigned) X2I (u * h)) % h; } else if (nOrient == 2) { bmx = ((unsigned) X2I ((I2X (1) - u) * w)) % w; bmy = ((unsigned) X2I ((I2X (1) - v) * h)) % h; } else { bmx = ((unsigned) X2I (v * w)) % w; bmy = ((unsigned) X2I ((I2X (1) - u) * h)) % h; } offs = bmy * w + bmx; if (bmP->Flags () & BM_FLAG_TGA) { ubyte *p; if (bmP->BPP () == 3) //no alpha -> no transparency return 0; p = bmP->Buffer () + offs * bmP->BPP (); // check super transparency color #if 1 if ((p [0] == 120) && (p [1] == 88) && (p [2] == 128)) #else if ((gameOpts->ogl.bGlTexMerge) ? (p [3] == 1) : ((p [0] == 120) && (p [1] == 88) && (p [2] == 128))) #endif return -1; // check alpha if (!p [3]) return 1; } else { c = bmP->Buffer () [offs]; if (c == SUPER_TRANSP_COLOR) return -1; if (c == TRANSPARENCY_COLOR) return 1; } return 0; }
void RenderFace (tFaceProps *propsP) { tFaceProps props = *propsP; CBitmap *bmBot = NULL; CBitmap *bmTop = NULL; int i, bIsMonitor, bIsTeleCam, bHaveMonitorBg, nCamNum, bCamBufAvail; g3sPoint *pointList [8], **pp; CSegment *segP = SEGMENTS + props.segNum; CSide *sideP = segP->m_sides + props.sideNum; CCamera *cameraP = NULL; if (props.nBaseTex < 0) return; if (gameStates.render.nShadowPass == 2) { #if DBG_SHADOWS if (!bWallShadows) return; #endif G3SetCullAndStencil (0, 0); RenderFaceShadow (propsP); G3SetCullAndStencil (1, 0); RenderFaceShadow (propsP); return; } #if DBG //convenient place for a debug breakpoint if (props.segNum == nDbgSeg && ((nDbgSide < 0) || (props.sideNum == nDbgSide))) props.segNum = props.segNum; if (props.nBaseTex == nDbgBaseTex) props.segNum = props.segNum; if (props.nOvlTex == nDbgOvlTex) props.segNum = props.segNum; # if 0 else return; # endif #endif gameData.render.vertexList = gameData.segs.fVertices.Buffer (); Assert(props.nVertices <= 4); for (i = 0, pp = pointList; i < props.nVertices; i++, pp++) *pp = gameData.segs.points + props.vp [i]; if (!(gameOpts->render.debug.bTextures || IsMultiGame)) goto drawWireFrame; #if 1 if (gameStates.render.nShadowBlurPass == 1) { G3DrawWhitePoly (props.nVertices, pointList); gameData.render.vertexList = NULL; return; } #endif SetVertexColors (&props); if (gameStates.render.nType == 2) { #if DBG //convenient place for a debug breakpoint if (props.segNum == nDbgSeg && ((nDbgSide < 0) || (props.sideNum == nDbgSide))) props.segNum = props.segNum; #endif RenderColoredSegFace (props.segNum, props.sideNum, props.nVertices, pointList); gameData.render.vertexList = NULL; return; } nCamNum = IsMonitorFace (props.segNum, props.sideNum, 0); if ((bIsMonitor = gameStates.render.bUseCameras && (nCamNum >= 0))) { cameraP = cameraManager.Camera (nCamNum); cameraP->SetVisible (1); bIsTeleCam = cameraP->GetTeleport (); #if RENDER2TEXTURE bCamBufAvail = cameraP->HaveBuffer (1) == 1; #else bCamBufAvail = 0; #endif bHaveMonitorBg = cameraP->Valid () && /*!cameraP->bShadowMap &&*/ (cameraP->HaveTexture () || bCamBufAvail) && (!bIsTeleCam || EGI_FLAG (bTeleporterCams, 0, 1, 0)); } else bIsTeleCam = bHaveMonitorBg = bCamBufAvail = 0; if (RenderWall (&props, pointList, bIsMonitor)) { //handle semi-transparent walls gameData.render.vertexList = NULL; return; } if (props.widFlags & WID_RENDER_FLAG) { if (props.nBaseTex >= gameData.pig.tex.nTextures [gameStates.app.bD1Data]) { sideP->m_nBaseTex = 0; } if (!(bHaveMonitorBg && gameOpts->render.cameras.bFitToWall)) { if (gameStates.render.nType == 3) { bmBot = bmpCorona; bmTop = NULL; props.uvls [0].u = props.uvls [0].v = props.uvls [1].v = props.uvls [3].u = I2X (1) / 4; props.uvls [1].u = props.uvls [2].u = props.uvls [2].v = props.uvls [3].v = I2X (3) / 4; } else if (gameOpts->ogl.bGlTexMerge) { bmBot = LoadFaceBitmap (props.nBaseTex, sideP->m_nFrame); if (props.nOvlTex) bmTop = LoadFaceBitmap ((short) (props.nOvlTex), sideP->m_nFrame); } else { if (props.nOvlTex != 0) { bmBot = TexMergeGetCachedBitmap (props.nBaseTex, props.nOvlTex, props.nOvlOrient); #if DBG if (!bmBot) bmBot = TexMergeGetCachedBitmap (props.nBaseTex, props.nOvlTex, props.nOvlOrient); #endif } else { bmBot = gameData.pig.tex.bitmapP + gameData.pig.tex.bmIndexP [props.nBaseTex].index; LoadBitmap (gameData.pig.tex.bmIndexP [props.nBaseTex].index, gameStates.app.bD1Mission); } } } if (bHaveMonitorBg) { cameraP->GetUVL (NULL, props.uvls, NULL, NULL); if (bIsTeleCam) { #if DBG bmBot = &cameraP->Texture (); gameStates.render.grAlpha = 1.0f; #else bmTop = &cameraP->Texture (); gameStates.render.grAlpha = 0.7f; #endif } else if (gameOpts->render.cameras.bFitToWall || (props.nOvlTex > 0)) bmBot = &cameraP->Texture (); else bmTop = &cameraP->Texture (); } SetFaceLight (&props); #if DBG //convenient place for a debug breakpoint if (props.segNum == nDbgSeg && props.sideNum == nDbgSide) props.segNum = props.segNum; #endif #if DBG if (bmTop) fpDrawTexPolyMulti ( props.nVertices, pointList, props.uvls, # if LIGHTMAPS props.uvl_lMaps, # endif bmBot, bmTop, # if LIGHTMAPS NULL, //lightmaps + props.segNum * 6 + props.sideNum, # endif &props.vNormal, props.nOvlOrient, !bIsMonitor || bIsTeleCam, props.segNum); else # if LIGHTMAPS == 0 G3DrawTexPoly (props.nVertices, pointList, props.uvls, bmBot, &props.vNormal, !bIsMonitor || bIsTeleCam, props.segNum); # else fpDrawTexPolyMulti ( props.nVertices, pointList, props.uvls, props.uvl_lMaps, bmBot, NULL, NULL, //lightmaps + props.segNum * 6 + props.sideNum, &props.vNormal, 0, !bIsMonitor || bIsTeleCam, props.segNum); # endif #else fpDrawTexPolyMulti ( props.nVertices, pointList, props.uvls, # if LIGHTMAPS props.uvl_lMaps, # endif bmBot, bmTop, # if LIGHTMAPS NULL, //lightmaps + props.segNum * 6 + props.sideNum, # endif &props.vNormal, props.nOvlOrient, !bIsMonitor || bIsTeleCam, props.segNum); #endif } gameStates.render.grAlpha = 1.0f; gameStates.ogl.fAlpha = 1; // render the CSegment the CPlayerData is in with a transparent color if it is a water or lava CSegment //if (nSegment == OBJECTS->nSegment) #if DBG if (bOutLineMode) DrawOutline (props.nVertices, pointList); #endif drawWireFrame: if (gameOpts->render.debug.bWireFrame && !IsMultiGame) DrawOutline (props.nVertices, pointList); }
int OglCacheLevelTextures (void) { int i, j, bD1; tEffectClip* ecP; int max_efx = 0, ef; int nSegment, nSide; short nBaseTex, nOvlTex; CBitmap* bmBot,* bmTop, * bmm; CSegment* segP; CSide* sideP; CObject* objP; CStaticArray< bool, MAX_POLYGON_MODELS > bModelLoaded; if (gameStates.render.bBriefing) return 0; PrintLog ("caching level textures\n"); TexMergeClose (); TexMergeInit (-1); PrintLog (" caching effect textures\n"); for (bD1 = 0; bD1 <= gameStates.app.bD1Data; bD1++) { for (i = 0, ecP = gameData.eff.effects [bD1].Buffer (); i < gameData.eff.nEffects [bD1]; i++, ecP++) { if ((ecP->changingWallTexture == -1) && (ecP->changingObjectTexture == -1)) continue; if (ecP->vClipInfo.nFrameCount > max_efx) max_efx = ecP->vClipInfo.nFrameCount; } for (ef = 0; ef < max_efx; ef++) for (i = 0, ecP = gameData.eff.effects [bD1].Buffer (); i < gameData.eff.nEffects [bD1]; i++, ecP++) { if ((ecP->changingWallTexture == -1) && (ecP->changingObjectTexture == -1)) continue; ecP->xTimeLeft = -1; } } PrintLog (" caching geometry textures\n"); bLoadTextures = (ogl.m_states.nPreloadTextures > 0); for (segP = SEGMENTS.Buffer (), nSegment = 0; nSegment < gameData.segs.nSegments; nSegment++, segP++) { for (nSide = 0, sideP = segP->m_sides; nSide < MAX_SIDES_PER_SEGMENT; nSide++, sideP++) { nBaseTex = sideP->m_nBaseTex; if ((nBaseTex < 0) || (nBaseTex >= gameData.pig.tex.nTextures [gameStates.app.bD1Data])) continue; #if DBG if ((nSegment == nDbgSeg) && ((nDbgSide < 0) || (nSide == nDbgSide))) nDbgSeg = nDbgSeg; #endif bmBot = LoadFaceBitmap (nBaseTex, sideP->m_nFrame, bLoadTextures); if ((nOvlTex = sideP->m_nOvlTex)) { bmTop = LoadFaceBitmap (nOvlTex, sideP->m_nFrame, bLoadTextures); bmTop->SetTranspType (3); if (gameOpts->ogl.bGlTexMerge) // || !(bmTop->Flags () & BM_FLAG_SUPER_TRANSPARENT)) bmTop->SetupTexture (1, bLoadTextures); else if ((bmm = TexMergeGetCachedBitmap (nBaseTex, nOvlTex, sideP->m_nOvlOrient))) bmBot = bmm; else bmTop->SetupTexture (1, bLoadTextures); } bmBot->SetTranspType (3); bmBot->SetupTexture (1, bLoadTextures); } } PrintLog (" caching addon textures\n"); CacheAddonTextures (); PrintLog (" caching model textures\n"); bLoadTextures = (ogl.m_states.nPreloadTextures > 1); bModelLoaded.Clear (); bVClipLoaded.Clear (); FORALL_OBJS (objP, i) { if (objP->info.renderType != RT_POLYOBJ) continue; if (bModelLoaded [objP->rType.polyObjInfo.nModel]) continue; bModelLoaded [objP->rType.polyObjInfo.nModel] = true; OglCachePolyModelTextures (objP->rType.polyObjInfo.nModel); } PrintLog (" caching hostage sprites\n"); bLoadTextures = (ogl.m_states.nPreloadTextures > 3); OglCacheVClipTextures (33, 3); PrintLog (" caching weapon sprites\n"); bLoadTextures = (ogl.m_states.nPreloadTextures > 5); for (i = 0; i < EXTRA_OBJ_IDS; i++) OglCacheWeaponTextures (gameData.weapons.info + i); PrintLog (" caching powerup sprites\n"); bLoadTextures = (ogl.m_states.nPreloadTextures > 4); for (i = 0; i < MAX_POWERUP_TYPES; i++) if (i != 9) OglCacheVClipTextures (gameData.objs.pwrUp.info [i].nClipIndex, 3); PrintLog (" caching effect textures\n"); CacheObjectEffects (); bLoadTextures = (ogl.m_states.nPreloadTextures > 2); for (i = 0; i < gameData.eff.nClips [0]; i++) OglCacheVClipTextures (i, 1); PrintLog (" caching cockpit textures\n"); for (i = 0; i < 2; i++) for (j = 0; j < MAX_GAUGE_BMS; j++) if (gameData.cockpit.gauges [i][j].index != 0xffff) LoadBitmap (gameData.cockpit.gauges [i][j].index, 0); ResetSpecialEffects (); InitSpecialEffects (); DoSpecialEffects (true); return 0; }