diff options
Diffstat (limited to 'src/rw')
-rw-r--r-- | src/rw/ClumpRead.cpp | 1 | ||||
-rw-r--r-- | src/rw/Lights.cpp | 52 | ||||
-rw-r--r-- | src/rw/Lights.h | 1 | ||||
-rw-r--r-- | src/rw/MemoryHeap.cpp | 4 | ||||
-rw-r--r-- | src/rw/MemoryHeap.h | 24 | ||||
-rw-r--r-- | src/rw/RwHelper.cpp | 183 | ||||
-rw-r--r-- | src/rw/RwHelper.h | 11 | ||||
-rw-r--r-- | src/rw/TexRead.cpp | 42 | ||||
-rw-r--r-- | src/rw/TxdStore.cpp | 2 | ||||
-rw-r--r-- | src/rw/VisibilityPlugins.cpp | 525 | ||||
-rw-r--r-- | src/rw/VisibilityPlugins.h | 17 |
11 files changed, 476 insertions, 386 deletions
diff --git a/src/rw/ClumpRead.cpp b/src/rw/ClumpRead.cpp index 5f50f52d..9c027dc5 100644 --- a/src/rw/ClumpRead.cpp +++ b/src/rw/ClumpRead.cpp @@ -1,6 +1,5 @@ #include "common.h" - struct rpGeometryList { RpGeometry **geometries; diff --git a/src/rw/Lights.cpp b/src/rw/Lights.cpp index b3cef6d4..772e1961 100644 --- a/src/rw/Lights.cpp +++ b/src/rw/Lights.cpp @@ -9,6 +9,7 @@ #include "Weather.h" #include "ZoneCull.h" #include "Frontend.h" +#include "MBlur.h" RpLight *pAmbient; RpLight *pDirect; @@ -23,6 +24,13 @@ RwRGBAReal DirectionalLightColourForFrame; RwRGBAReal AmbientLightColour; RwRGBAReal DirectionalLightColour; +#ifdef EXTENDED_COLOURFILTER +#include "postfx.h" +#define USEBLURCOLORS CPostFX::UseBlurColours() +#else +#define USEBLURCOLORS CMBlur::BlurOn +#endif + void SetLightsWithTimeOfDayColour(RpWorld *) { @@ -30,17 +38,35 @@ SetLightsWithTimeOfDayColour(RpWorld *) RwMatrix mat; if(pAmbient){ - AmbientLightColourForFrame.red = CTimeCycle::GetAmbientRed() * CCoronas::LightsMult; - AmbientLightColourForFrame.green = CTimeCycle::GetAmbientGreen() * CCoronas::LightsMult; - AmbientLightColourForFrame.blue = CTimeCycle::GetAmbientBlue() * CCoronas::LightsMult; + if(USEBLURCOLORS){ + AmbientLightColourForFrame.red = CTimeCycle::GetAmbientRed_Bl() * CCoronas::LightsMult; + AmbientLightColourForFrame.green = CTimeCycle::GetAmbientGreen_Bl() * CCoronas::LightsMult; + AmbientLightColourForFrame.blue = CTimeCycle::GetAmbientBlue_Bl() * CCoronas::LightsMult; + }else{ + AmbientLightColourForFrame.red = CTimeCycle::GetAmbientRed() * CCoronas::LightsMult; + AmbientLightColourForFrame.green = CTimeCycle::GetAmbientGreen() * CCoronas::LightsMult; + AmbientLightColourForFrame.blue = CTimeCycle::GetAmbientBlue() * CCoronas::LightsMult; + } + + if(USEBLURCOLORS){ + AmbientLightColourForFrame_PedsCarsAndObjects.red = CTimeCycle::GetAmbientRed_Obj_Bl() * CCoronas::LightsMult; + AmbientLightColourForFrame_PedsCarsAndObjects.green = CTimeCycle::GetAmbientGreen_Obj_Bl() * CCoronas::LightsMult; + AmbientLightColourForFrame_PedsCarsAndObjects.blue = CTimeCycle::GetAmbientBlue_Obj_Bl() * CCoronas::LightsMult; + }else{ + AmbientLightColourForFrame_PedsCarsAndObjects.red = CTimeCycle::GetAmbientRed_Obj() * CCoronas::LightsMult; + AmbientLightColourForFrame_PedsCarsAndObjects.green = CTimeCycle::GetAmbientGreen_Obj() * CCoronas::LightsMult; + AmbientLightColourForFrame_PedsCarsAndObjects.blue = CTimeCycle::GetAmbientBlue_Obj() * CCoronas::LightsMult; + } + if(CWeather::LightningFlash && !CCullZones::CamNoRain()){ AmbientLightColourForFrame.red = 1.0f; AmbientLightColourForFrame.green = 1.0f; AmbientLightColourForFrame.blue = 1.0f; + + AmbientLightColourForFrame_PedsCarsAndObjects.red = 1.0f; + AmbientLightColourForFrame_PedsCarsAndObjects.green = 1.0f; + AmbientLightColourForFrame_PedsCarsAndObjects.blue = 1.0f; } - AmbientLightColourForFrame_PedsCarsAndObjects.red = Min(1.0f, AmbientLightColourForFrame.red*1.3f); - AmbientLightColourForFrame_PedsCarsAndObjects.green = Min(1.0f, AmbientLightColourForFrame.green*1.3f); - AmbientLightColourForFrame_PedsCarsAndObjects.blue = Min(1.0f, AmbientLightColourForFrame.blue*1.3f); RpLightSetColor(pAmbient, &AmbientLightColourForFrame); } @@ -67,9 +93,9 @@ SetLightsWithTimeOfDayColour(RpWorld *) RwFrameTransform(RpLightGetFrame(pDirect), &mat, rwCOMBINEREPLACE); } - if(CMenuManager::m_PrefsBrightness > 256){ - float f1 = 2.0f * (CMenuManager::m_PrefsBrightness/256.0f - 1.0f) * 0.6f + 1.0f; - float f2 = 3.0f * (CMenuManager::m_PrefsBrightness/256.0f - 1.0f) * 0.6f + 1.0f; + if(FrontEndMenuManager.m_PrefsBrightness > 256){ + float f1 = 2.0f * (FrontEndMenuManager.m_PrefsBrightness/256.0f - 1.0f) * 0.6f + 1.0f; + float f2 = 3.0f * (FrontEndMenuManager.m_PrefsBrightness/256.0f - 1.0f) * 0.6f + 1.0f; AmbientLightColourForFrame.red = Min(1.0f, AmbientLightColourForFrame.red * f2); AmbientLightColourForFrame.green = Min(1.0f, AmbientLightColourForFrame.green * f2); @@ -323,6 +349,14 @@ ActivateDirectional(void) RpLightSetFlags(pDirect, rpLIGHTLIGHTATOMICS); } +RwRGBAReal FullLight = { 1.0f, 1.0f, 1.0f, 1.0f }; + +void +SetFullAmbient(void) +{ + RpLightSetColor(pAmbient, &FullLight); +} + void SetAmbientColours(void) { diff --git a/src/rw/Lights.h b/src/rw/Lights.h index 5057f1d0..ad355adb 100644 --- a/src/rw/Lights.h +++ b/src/rw/Lights.h @@ -24,3 +24,4 @@ void SetAmbientColours(void); void SetAmbientColoursForPedsCarsAndObjects(void); void SetAmbientColoursToIndicateRoadGroup(int i); void SetAmbientColours(RwRGBAReal *color); +void SetFullAmbient(void); diff --git a/src/rw/MemoryHeap.cpp b/src/rw/MemoryHeap.cpp index 469262d3..285a7c70 100644 --- a/src/rw/MemoryHeap.cpp +++ b/src/rw/MemoryHeap.cpp @@ -7,6 +7,8 @@ #include "FileLoader.h" #include "MemoryHeap.h" +// TODO(MIAMI) + #ifdef USE_CUSTOM_ALLOCATOR //#define MEMORYHEAP_ASSERT(cond) { if (!(cond)) { printf("ASSERT File:%s Line:%d\n", __FILE__, __LINE__); exit(1); } } @@ -339,7 +341,7 @@ CMemoryHeap::TidyHeap(void) } } -// +// MIAMI: this is empty void CMemoryHeap::RegisterMemPointer(void *ptr) { diff --git a/src/rw/MemoryHeap.h b/src/rw/MemoryHeap.h index cd8cf22c..1a9a51f8 100644 --- a/src/rw/MemoryHeap.h +++ b/src/rw/MemoryHeap.h @@ -23,17 +23,19 @@ enum { MEMID_POOLS = 4, // "Pools" MEMID_DEF_MODELS = 5, // "Default Models" MEMID_STREAM = 6, // "Streaming" - MEMID_STREAM_MODELS = 7, // "Streamed Models" (instance) - MEMID_STREAM_TEXUTRES = 8, // "Streamed Textures" - MEMID_TEXTURES = 9, // "Textures" - MEMID_COLLISION = 10, // "Collision" - MEMID_RENDERLIST = 11, // ? - MEMID_GAME_PROCESS = 12, // "Game Process" - MEMID_SCRIPT = 13, // "Script" - MEMID_CARS = 14, // "Cars" - MEMID_RENDER = 15, // "Render" - MEMID_FRONTEND = 17, // ? - + MEMID_STREAM_MODELS = 7, // "Streamed Models" + MEMID_STREAM_LODS = 8, // "Streamed LODs" + MEMID_STREAM_TEXUTRES = 9, // "Streamed Textures" + MEMID_STREAM_COLLISION = 10, // "Streamed Collision" + MEMID_STREAM_ANIMATION = 11, // "Streamed Animation" + MEMID_TEXTURES = 12, // "Textures" + MEMID_COLLISION = 13, // "Collision" + MEMID_PRE_ALLOC = 14, // "PreAlloc" + MEMID_GAME_PROCESS = 15, // "Game Process" + MEMID_SCRIPT = 16, // "Script" + MEMID_CARS = 17, // "Cars" + MEMID_RENDER = 18, // "Render" + MEMID_PED_ATTR = 19, // "Ped Attr" NUM_MEMIDS, NUM_FIXED_MEMBLOCKS = 6 diff --git a/src/rw/RwHelper.cpp b/src/rw/RwHelper.cpp index 35593722..25cd2eef 100644 --- a/src/rw/RwHelper.cpp +++ b/src/rw/RwHelper.cpp @@ -2,7 +2,6 @@ #include "common.h" #include <rpskin.h> -#include "RwHelper.h" #include "Timecycle.h" #include "skeleton.h" #include "Debug.h" @@ -77,7 +76,7 @@ DefinedState(void) RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); - RwRenderStateSet(rwRENDERSTATEALPHAPRIMITIVEBUFFER, (void*)FALSE); + //RwRenderStateSet(rwRENDERSTATEALPHAPRIMITIVEBUFFER, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEBORDERCOLOR, (void*)RWRGBALONG(0, 0, 0, 255)); RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEFOGCOLOR, @@ -87,22 +86,13 @@ DefinedState(void) #ifdef LIBRW rw::SetRenderState(rw::ALPHATESTFUNC, rw::ALPHAGREATEREQUAL); + rw::SetRenderState(rw::ALPHATESTREF, 3); rw::SetRenderState(rw::GSALPHATEST, gPS2alphaTest); #else // D3D stuff RwD3D8SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER); -#endif - SetAlphaRef(2); -} - -void -SetAlphaRef(int ref) -{ -#ifdef LIBRW - rw::SetRenderState(rw::ALPHATESTREF, ref+1); -#else - RwD3D8SetRenderState(D3DRS_ALPHAREF, ref); + RwD3D8SetRenderState(D3DRS_ALPHAREF, 2); #endif } @@ -213,24 +203,11 @@ GetFirstTexture(RwTexDictionary *txd) return tex; } -#ifdef PED_SKIN -static RpAtomic* -isSkinnedCb(RpAtomic *atomic, void *data) -{ - RpAtomic **pAtomic = (RpAtomic**)data; - if(*pAtomic) - return nil; // already found one - if(RpSkinGeometryGetSkin(RpAtomicGetGeometry(atomic))) - *pAtomic = atomic; // we could just return nil here directly... - return atomic; -} - -RpAtomic* +bool IsClumpSkinned(RpClump *clump) { - RpAtomic *atomic = nil; - RpClumpForAllAtomics(clump, isSkinnedCb, &atomic); - return atomic; + RpAtomic *atomic = GetFirstAtomic(clump); + return atomic ? RpSkinGeometryGetSkin(RpAtomicGetGeometry(atomic)) : nil; } static RpAtomic* @@ -268,17 +245,6 @@ GetAnimHierarchyFromClump(RpClump *clump) return hier; } -RwFrame* -GetHierarchyFromChildNodesCB(RwFrame *frame, void *data) -{ - RpHAnimHierarchy **pHier = (RpHAnimHierarchy**)data; - RpHAnimHierarchy *hier = RpHAnimFrameGetHierarchy(frame); - if(hier == nil) - RwFrameForAllChildren(frame, GetHierarchyFromChildNodesCB, &hier); - *pHier = hier; - return nil; -} - void SkinGetBonePositionsToTable(RpClump *clump, RwV3d *boneTable) { @@ -294,8 +260,7 @@ SkinGetBonePositionsToTable(RpClump *clump, RwV3d *boneTable) if(boneTable == nil) return; -// atomic = GetFirstAtomic(clump); // mobile, also VC - atomic = IsClumpSkinned(clump); // xbox, seems safer + atomic = GetFirstAtomic(clump); // mobile, also VC assert(atomic); skin = RpSkinGeometryGetSkin(RpAtomicGetGeometry(atomic)); assert(skin); @@ -382,7 +347,125 @@ RenderSkeleton(RpHAnimHierarchy *hier) par = stack[--sp]; } } -#endif + + +RwBool Im2DRenderQuad(RwReal x1, RwReal y1, RwReal x2, RwReal y2, RwReal z, RwReal recipCamZ, RwReal uvOffset) +{ + RwIm2DVertex vx[4]; + + /* + * Render an opaque white 2D quad at the given coordinates and + * spanning a whole texture. + */ + + RwIm2DVertexSetScreenX(&vx[0], x1); + RwIm2DVertexSetScreenY(&vx[0], y1); + RwIm2DVertexSetScreenZ(&vx[0], z); + RwIm2DVertexSetIntRGBA(&vx[0], 255, 255, 255, 255); + RwIm2DVertexSetRecipCameraZ(&vx[0], recipCamZ); + RwIm2DVertexSetU(&vx[0], uvOffset, recipCamZ); + RwIm2DVertexSetV(&vx[0], uvOffset, recipCamZ); + + RwIm2DVertexSetScreenX(&vx[1], x1); + RwIm2DVertexSetScreenY(&vx[1], y2); + RwIm2DVertexSetScreenZ(&vx[1], z); + RwIm2DVertexSetIntRGBA(&vx[1], 255, 255, 255, 255); + RwIm2DVertexSetRecipCameraZ(&vx[1], recipCamZ); + RwIm2DVertexSetU(&vx[1], uvOffset, recipCamZ); + RwIm2DVertexSetV(&vx[1], 1.0f + uvOffset, recipCamZ); + + RwIm2DVertexSetScreenX(&vx[2], x2); + RwIm2DVertexSetScreenY(&vx[2], y1); + RwIm2DVertexSetScreenZ(&vx[2], z); + RwIm2DVertexSetIntRGBA(&vx[2], 255, 255, 255, 255); + RwIm2DVertexSetRecipCameraZ(&vx[2], recipCamZ); + RwIm2DVertexSetU(&vx[2], 1.0f + uvOffset, recipCamZ); + RwIm2DVertexSetV(&vx[2], uvOffset, recipCamZ); + + RwIm2DVertexSetScreenX(&vx[3], x2); + RwIm2DVertexSetScreenY(&vx[3], y2); + RwIm2DVertexSetScreenZ(&vx[3], z); + RwIm2DVertexSetIntRGBA(&vx[3], 255, 255, 255, 255); + RwIm2DVertexSetRecipCameraZ(&vx[3], recipCamZ); + RwIm2DVertexSetU(&vx[3], 1.0f + uvOffset, recipCamZ); + RwIm2DVertexSetV(&vx[3], 1.0f + uvOffset, recipCamZ); + + RwIm2DRenderPrimitive(rwPRIMTYPETRISTRIP, vx, 4); + + return TRUE; +} + +bool b_cbsUseLTM = true; + +RpAtomic *cbsCalcMeanBSphereRadiusCB(RpAtomic *atomic, void *data) +{ + RwV3d atomicPos; + + if ( b_cbsUseLTM ) + RwV3dTransformPoints(&atomicPos, &RpAtomicGetBoundingSphere(atomic)->center, 1, RwFrameGetLTM(RpClumpGetFrame(atomic->clump))); + else + RwV3dTransformPoints(&atomicPos, &RpAtomicGetBoundingSphere(atomic)->center, 1, RwFrameGetMatrix(RpClumpGetFrame(atomic->clump))); + + RwV3d temp; + RwV3dSub(&temp, &atomicPos, &((RwSphere *)data)->center); + RwReal radius = RwV3dLength(&temp) + RpAtomicGetBoundingSphere(atomic)->radius; + + if ( ((RwSphere *)data)->radius < radius ) + ((RwSphere *)data)->radius = radius; + + return atomic; +} + +RpAtomic *cbsCalcMeanBSphereCenterCB(RpAtomic *atomic, void *data) +{ + RwV3d atomicPos; + + if ( b_cbsUseLTM ) + RwV3dTransformPoints(&atomicPos, &RpAtomicGetBoundingSphere(atomic)->center, 1, RwFrameGetLTM(RpClumpGetFrame(atomic->clump))); + else + RwV3dTransformPoints(&atomicPos, &RpAtomicGetBoundingSphere(atomic)->center, 1, RwFrameGetMatrix(RpClumpGetFrame(atomic->clump))); + + RwV3dAdd(&((RwSphere *)data)->center, &((RwSphere *)data)->center, &atomicPos); + + return atomic; +} + +RpClump *RpClumpGetBoundingSphere(RpClump *clump, RwSphere *sphere, bool useLTM) +{ + RwMatrix matrix; + RwSphere result = { 0.0f, 0.0f, 0.0f, 0.0f }; + + b_cbsUseLTM = useLTM; + + if ( clump == nil || sphere == nil ) + return nil; + + sphere->radius = 0.0f; + sphere->center.x = 0.0f; + sphere->center.y = 0.0f; + sphere->center.z = 0.0f; + + RwInt32 numAtomics = RpClumpGetNumAtomics(clump); + if ( numAtomics < 1.0f ) + return nil; + + RpClumpForAllAtomics(clump, cbsCalcMeanBSphereCenterCB, &result); + + RwV3dScale(&result.center, &result.center, 1.0f/numAtomics); + + RpClumpForAllAtomics(clump, cbsCalcMeanBSphereRadiusCB, &result); + + if ( b_cbsUseLTM ) + RwMatrixInvert(&matrix, RwFrameGetLTM(RpClumpGetFrame(clump))); + else + RwMatrixInvert(&matrix, RwFrameGetMatrix(RpClumpGetFrame(clump))); + + RwV3dTransformPoints(&result.center, &result.center, 1, &matrix); + + *sphere = result; + + return clump; +} void CameraSize(RwCamera * camera, RwRect * rect, @@ -495,7 +578,7 @@ CameraSize(RwCamera * camera, RwRect * rect, #else raster = RwCameraGetRaster(camera); zRaster = RwCameraGetZRaster(camera); - + raster->width = zRaster->width = rect->w; raster->height = zRaster->height = rect->h; #endif @@ -636,16 +719,6 @@ findPlatform(rw::Atomic *a) return 0; } -// in CVehicleModelInfo in VC -static RpMaterial* -GetMatFXEffectMaterialCB(RpMaterial *material, void *data) -{ - if(RpMatFXMaterialGetEffects(material) == rpMATFXEFFECTNULL) - return material; - *(int*)data = RpMatFXMaterialGetEffects(material); - return nil; -} - // Game doesn't read atomic extensions so we never get any other than the default pipe, // but we need it for uninstancing void @@ -655,7 +728,7 @@ attachPipe(rw::Atomic *atomic) atomic->pipeline = rw::skinGlobals.pipelines[rw::platform]; else{ int fx = rpMATFXEFFECTNULL; - RpGeometryForAllMaterials(RpAtomicGetGeometry(atomic), GetMatFXEffectMaterialCB, &fx); + RpGeometryForAllMaterials(RpAtomicGetGeometry(atomic), CVehicleModelInfo::GetMatFXEffectMaterialCB, &fx); if(fx != rpMATFXEFFECTNULL) RpMatFXAtomicEnableEffects(atomic); } diff --git a/src/rw/RwHelper.h b/src/rw/RwHelper.h index 0e04aece..a3a1928c 100644 --- a/src/rw/RwHelper.h +++ b/src/rw/RwHelper.h @@ -2,6 +2,7 @@ extern bool bDebugRenderGroups; extern bool gPS2alphaTest; +extern bool gBackfaceCulling; void OpenCharsetSafe(); void CreateDebugFont(); @@ -9,23 +10,22 @@ void DestroyDebugFont(); void ObrsPrintfString(const char *str, short x, short y); void FlushObrsPrintfs(); void DefinedState(void); -void SetAlphaRef(int ref); void SetCullMode(uint32 mode); RwFrame *GetFirstChild(RwFrame *frame); RwObject *GetFirstObject(RwFrame *frame); RpAtomic *GetFirstAtomic(RpClump *clump); RwTexture *GetFirstTexture(RwTexDictionary *txd); -#ifdef PED_SKIN -RpAtomic *IsClumpSkinned(RpClump *clump); +bool IsClumpSkinned(RpClump *clump); RpHAnimHierarchy *GetAnimHierarchyFromSkinClump(RpClump *clump); // get from atomic RpHAnimHierarchy *GetAnimHierarchyFromClump(RpClump *clump); // get from frame -RwFrame *GetHierarchyFromChildNodesCB(RwFrame *frame, void *data); void SkinGetBonePositionsToTable(RpClump *clump, RwV3d *boneTable); RpHAnimAnimation *HAnimAnimationCreateForHierarchy(RpHAnimHierarchy *hier); RpAtomic *AtomicRemoveAnimFromSkinCB(RpAtomic *atomic, void *data); void RenderSkeleton(RpHAnimHierarchy *hier); -#endif + +RwBool Im2DRenderQuad(RwReal x1, RwReal y1, RwReal x2, RwReal y2, RwReal z, RwReal recipCamZ, RwReal uvOffset); +RpClump *RpClumpGetBoundingSphere(RpClump *clump, RwSphere *sphere, bool useLTM); RwTexDictionary *RwTexDictionaryGtaStreamRead(RwStream *stream); RwTexDictionary *RwTexDictionaryGtaStreamRead1(RwStream *stream); @@ -33,6 +33,7 @@ RwTexDictionary *RwTexDictionaryGtaStreamRead2(RwStream *stream, RwTexDictionary void ReadVideoCardCapsFile(uint32&, uint32&, uint32&, uint32&); bool CheckVideoCardCaps(void); void WriteVideoCardCapsFile(void); +bool CanVideoCardDoDXT(void); void ConvertingTexturesScreen(uint32, uint32, const char*); void DealWithTxdWriteError(uint32, uint32, const char*); bool CreateTxdImageForVideoCard(); diff --git a/src/rw/TexRead.cpp b/src/rw/TexRead.cpp index 98e7d180..1f96180b 100644 --- a/src/rw/TexRead.cpp +++ b/src/rw/TexRead.cpp @@ -2,6 +2,9 @@ #pragma warning( disable : 4005) #pragma warning( pop ) #define FORCE_PC_SCALING +#ifndef LIBRW +#define WITHD3D +#endif #include "common.h" #ifdef ANISOTROPIC_FILTERING #include "rpanisot.h" @@ -233,8 +236,10 @@ WriteVideoCardCapsFile(void) } } + #else extern "C" RwInt32 _rwD3D8FindCorrectRasterFormat(RwRasterType type, RwInt32 flags); +extern "C" RwBool _rwD3D8CheckValidTextureFormat(RwInt32 format); void ReadVideoCardCapsFile(uint32 &cap32, uint32 &cap24, uint32 &cap16, uint32 &cap8) { @@ -283,6 +288,21 @@ WriteVideoCardCapsFile(void) } #endif +bool +CanVideoCardDoDXT(void) +{ +#ifdef LIBRW + // TODO +#ifdef RW_OPENGL + return false; +#else + return true; +#endif +#else + return _rwD3D8CheckValidTextureFormat(D3DFMT_DXT1) && _rwD3D8CheckValidTextureFormat(D3DFMT_DXT3); +#endif +} + void ConvertingTexturesScreen(uint32 num, uint32 count, const char *text) { @@ -301,7 +321,11 @@ ConvertingTexturesScreen(uint32 num, uint32 count, const char *text) splash->Draw(CRect(0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT), CRGBA(255, 255, 255, 255)); CSprite2d::DrawRect(CRect(SCREEN_SCALE_X(200.0f), SCREEN_SCALE_Y(240.0f), SCREEN_SCALE_FROM_RIGHT(200.0f), SCREEN_SCALE_Y(248.0f)), CRGBA(64, 64, 64, 255)); +#ifdef FIX_BUGS + CSprite2d::DrawRect(CRect(SCREEN_SCALE_X(200.0f), SCREEN_SCALE_Y(240.0f), (SCREEN_SCALE_FROM_RIGHT(200.0f) - SCREEN_SCALE_X(200.0f)) * ((float)num / (float)count) + SCREEN_SCALE_X(200.0f), SCREEN_SCALE_Y(248.0f)), CRGBA(255, 150, 225, 255)); +#else CSprite2d::DrawRect(CRect(SCREEN_SCALE_X(200.0f), SCREEN_SCALE_Y(240.0f), (SCREEN_SCALE_FROM_RIGHT(200.0f) - SCREEN_SCALE_X(200.0f)) * ((float)num / (float)count) + SCREEN_SCALE_X(200.0f), SCREEN_SCALE_Y(248.0f)), CRGBA(255, 217, 106, 255)); +#endif CSprite2d::DrawRect(CRect(SCREEN_SCALE_X(120.0f), SCREEN_SCALE_Y(150.0f), SCREEN_SCALE_FROM_RIGHT(120.0f), SCREEN_HEIGHT - SCREEN_SCALE_Y(220.0f)), CRGBA(50, 50, 50, 210)); CFont::SetBackgroundOff(); @@ -310,9 +334,13 @@ ConvertingTexturesScreen(uint32 num, uint32 count, const char *text) CFont::SetCentreOff(); CFont::SetWrapx(SCREEN_SCALE_FROM_RIGHT(170.0f)); CFont::SetJustifyOff(); +#ifdef FIX_BUGS + CFont::SetColor(CRGBA(255, 150, 225, 255)); +#else CFont::SetColor(CRGBA(255, 217, 106, 255)); +#endif CFont::SetBackGroundOnlyTextOff(); - CFont::SetFontStyle(FONT_BANK); + CFont::SetFontStyle(FONT_STANDARD); CFont::PrintString(SCREEN_SCALE_X(170.0f), SCREEN_SCALE_Y(160.0f), TheText.Get(text)); CFont::DrawFonts(); DoRWStuffEndOfFrame(); @@ -373,10 +401,10 @@ CreateTxdImageForVideoCard() #ifdef DISABLE_VSYNC_ON_TEXTURE_CONVERSION // let's disable vsync and frame limiter to speed up texture conversion // (actually we probably don't need to disable frame limiter in here, but let's do it just in case =P) - int8 vsyncState = CMenuManager::m_PrefsVsync; - int8 frameLimiterState = CMenuManager::m_PrefsFrameLimiter; - CMenuManager::m_PrefsVsync = 0; - CMenuManager::m_PrefsFrameLimiter = 0; + int8 vsyncState = FrontEndMenuManager.m_PrefsVsync; + int8 frameLimiterState = FrontEndMenuManager.m_PrefsFrameLimiter; + FrontEndMenuManager.m_PrefsVsync = 0; + FrontEndMenuManager.m_PrefsFrameLimiter = 0; #endif int32 i; @@ -434,8 +462,8 @@ CreateTxdImageForVideoCard() #ifdef DISABLE_VSYNC_ON_TEXTURE_CONVERSION // restore vsync and frame limiter states - CMenuManager::m_PrefsVsync = vsyncState; - CMenuManager::m_PrefsFrameLimiter = frameLimiterState; + FrontEndMenuManager.m_PrefsVsync = vsyncState; + FrontEndMenuManager.m_PrefsFrameLimiter = frameLimiterState; #endif RwStreamClose(img, nil); diff --git a/src/rw/TxdStore.cpp b/src/rw/TxdStore.cpp index a9e29729..0bd29718 100644 --- a/src/rw/TxdStore.cpp +++ b/src/rw/TxdStore.cpp @@ -13,7 +13,7 @@ void CTxdStore::Initialise(void) { if(ms_pTxdPool == nil) - ms_pTxdPool = new CPool<TxdDef,TxdDef>(TXDSTORESIZE); + ms_pTxdPool = new CPool<TxdDef,TxdDef>(TXDSTORESIZE, "TexDictionary"); } void diff --git a/src/rw/VisibilityPlugins.cpp b/src/rw/VisibilityPlugins.cpp index e6d4641d..01f2c8e7 100644 --- a/src/rw/VisibilityPlugins.cpp +++ b/src/rw/VisibilityPlugins.cpp @@ -6,6 +6,7 @@ #include "Entity.h" #include "ModelInfo.h" #include "Lights.h" +#include "RwHelper.h" #include "Renderer.h" #include "Camera.h" #include "VisibilityPlugins.h" @@ -14,7 +15,9 @@ #include "MemoryHeap.h" CLinkList<CVisibilityPlugins::AlphaObjectInfo> CVisibilityPlugins::m_alphaList; +CLinkList<CVisibilityPlugins::AlphaObjectInfo> CVisibilityPlugins::m_alphaBoatAtomicList; CLinkList<CVisibilityPlugins::AlphaObjectInfo> CVisibilityPlugins::m_alphaEntityList; +CLinkList<CVisibilityPlugins::AlphaObjectInfo> CVisibilityPlugins::m_alphaUnderwaterEntityList; #ifdef NEW_RENDERER CLinkList<CVisibilityPlugins::AlphaObjectInfo> CVisibilityPlugins::m_alphaBuildingList; #endif @@ -31,122 +34,10 @@ float CVisibilityPlugins::ms_vehicleLod1Dist; float CVisibilityPlugins::ms_vehicleFadeDist; float CVisibilityPlugins::ms_bigVehicleLod0Dist; float CVisibilityPlugins::ms_bigVehicleLod1Dist; -float CVisibilityPlugins::ms_pedLod0Dist; float CVisibilityPlugins::ms_pedLod1Dist; float CVisibilityPlugins::ms_pedFadeDist; -#ifdef GTA_PS2 // maybe something else? -// if wanted, delete the original geometry data after rendering -// and only keep the instanced data -bool -rpDefaultGeometryInstance(RpGeometry *geo, void *atomic, int del) -{ -#if THIS_IS_COMPATIBLE_WITH_GTA3_RW31 - if(RpGeometryGetNumMorphTargets(geo) != 1) - return false; - - // this needs R*'s modification that geometry data is - // allocated separately from the geometry itself - geo->instanceFlags = rpGEOMETRYINSTANCE; - AtomicDefaultRenderCallBack((RpAtomic*)atomic); - - if(!del) - return true; - - // New mesh without indices - RpMeshHeader *newheader = _rpMeshHeaderCreate(sizeof(RpMesh)*geo->mesh->numMeshes + sizeof(RpMeshHeader)); - newheader->numMeshes = geo->mesh->numMeshes; - newheader->serialNum = 1; - newheader->totalIndicesInMesh = 0; - newheader->firstMeshOffset = 0; - RpMesh *oldmesh = (RpMesh*)(geo->mesh+1); - RpMesh *newmesh = (RpMesh*)(newheader+1); - for(int i = 0; i < geo->mesh->numMeshes; i++){ - newmesh[i].indices = nil; - newmesh[i].numIndices = 0; - newmesh[i].material = oldmesh[i].material; - } - - geo->refCount++; - RpGeometryLock(geo, rpGEOMETRYLOCKPOLYGONS | rpGEOMETRYLOCKVERTICES | - rpGEOMETRYLOCKNORMALS | rpGEOMETRYLOCKPRELIGHT | - rpGEOMETRYLOCKTEXCOORDS1 | rpGEOMETRYLOCKTEXCOORDS2); - - // vertices and normals - RpMorphTarget *mt = RpGeometryGetMorphTarget(geo, 0); - if(mt->verts){ - RwFree(mt->verts); - mt->verts = nil; - mt->normals = nil; - } - geo->numVertices = 0; - - // triangles - for(int i = 0; i < RpGeometryGetNumTriangles(geo); i++){ - if(RpGeometryGetTriangles(geo)->matIndex == -1) - continue; - RpMaterialDestroy(_rpMaterialListGetMaterial(&geo->matList, RpGeometryGetTriangles(geo)->matIndex)); - } - if(RpGeometryGetTriangles(geo)){ - RwFree(RpGeometryGetTriangles(geo)); - geo->triangles = nil; - geo->numTriangles = 0; - } - - // tex coords - if(RpGeometryGetVertexTexCoords(geo, 1)){ - RwFree(RpGeometryGetVertexTexCoords(geo, 1)); - geo->texCoords[1] = nil; - } - if(RpGeometryGetVertexTexCoords(geo, 0)){ - RwFree(RpGeometryGetVertexTexCoords(geo, 0)); - geo->texCoords[0] = nil; - } - - // vertex colors - if(RpGeometryGetPreLightColors(geo)){ - RwFree(RpGeometryGetPreLightColors(geo)); - geo->preLitLum = nil; - } - - RpGeometryUnlock(geo); - - geo->instanceFlags = rpGEOMETRYPERSISTENT; - // BUG? don't we have to free the old mesh? - geo->mesh = newheader; - geo->refCount--; -#else - // We can do something for librw here actually, maybe later - AtomicDefaultRenderCallBack((RpAtomic*)atomic); -#endif - - return true; -} - -RpAtomic* -PreInstanceRenderCB(RpAtomic *atomic) -{ - RpGeometry *geo = RpAtomicGetGeometry(atomic); - if(RpGeometryGetTriangles(geo)){ - PUSH_MEMID(MEMID_STREAM_MODELS); - rpDefaultGeometryInstance(geo, atomic, 1); - POP_MEMID(); - }else - AtomicDefaultRenderCallBack(atomic); - return atomic; -} -#define RENDERCALLBACK PreInstanceRenderCB -#else -RpAtomic* -DefaultRenderCB_pushid(RpAtomic *atomic) -{ - PUSH_MEMID(MEMID_STREAM_MODELS); - AtomicDefaultRenderCallBack(atomic); - POP_MEMID(); - return atomic; -} -#define RENDERCALLBACK DefaultRenderCB_pushid -#endif +#define RENDERCALLBACK AtomicDefaultRenderCallBack void CVisibilityPlugins::Initialise(void) @@ -154,6 +45,11 @@ CVisibilityPlugins::Initialise(void) m_alphaList.Init(NUMALPHALIST); m_alphaList.head.item.sort = 0.0f; m_alphaList.tail.item.sort = 100000000.0f; + + m_alphaBoatAtomicList.Init(NUMBOATALPHALIST); + m_alphaBoatAtomicList.head.item.sort = 0.0f; + m_alphaBoatAtomicList.tail.item.sort = 100000000.0f; + #ifdef ASPECT_RATIO_SCALE // default 150 is not enough for bigger FOVs m_alphaEntityList.Init(NUMALPHAENTITYLIST * 3); @@ -163,6 +59,10 @@ CVisibilityPlugins::Initialise(void) m_alphaEntityList.head.item.sort = 0.0f; m_alphaEntityList.tail.item.sort = 100000000.0f; + m_alphaUnderwaterEntityList.Init(NUMALPHAUNTERWATERENTITYLIST); + m_alphaUnderwaterEntityList.head.item.sort = 0.0f; + m_alphaUnderwaterEntityList.tail.item.sort = 100000000.0f; + #ifdef NEW_RENDERER m_alphaBuildingList.Init(NUMALPHAENTITYLIST); m_alphaBuildingList.head.item.sort = 0.0f; @@ -174,7 +74,9 @@ void CVisibilityPlugins::Shutdown(void) { m_alphaList.Shutdown(); + m_alphaBoatAtomicList.Shutdown(); m_alphaEntityList.Shutdown(); + m_alphaUnderwaterEntityList.Shutdown(); #ifdef NEW_RENDERER m_alphaBuildingList.Shutdown(); #endif @@ -184,6 +86,8 @@ void CVisibilityPlugins::InitAlphaEntityList(void) { m_alphaEntityList.Clear(); + m_alphaBoatAtomicList.Clear(); + m_alphaUnderwaterEntityList.Clear(); #ifdef NEW_RENDERER m_alphaBuildingList.Clear(); #endif @@ -203,10 +107,9 @@ CVisibilityPlugins::InsertEntityIntoSortedList(CEntity *e, float dist) if(gbNewRenderer && e->IsBuilding()) return !!m_alphaBuildingList.InsertSorted(item); #endif - bool ret = !!m_alphaEntityList.InsertSorted(item); -// if(!ret) -// printf("list full %d\n", m_alphaEntityList.Count()); - return ret; + if(e->bUnderwater && m_alphaUnderwaterEntityList.InsertSorted(item)) + return true; + return !!m_alphaEntityList.InsertSorted(item); } void @@ -221,10 +124,16 @@ CVisibilityPlugins::InsertAtomicIntoSortedList(RpAtomic *a, float dist) AlphaObjectInfo item; item.atomic = a; item.sort = dist; - bool ret = !!m_alphaList.InsertSorted(item); -// if(!ret) -// printf("list full %d\n", m_alphaList.Count()); - return ret; + return !!m_alphaList.InsertSorted(item); +} + +bool +CVisibilityPlugins::InsertAtomicIntoBoatSortedList(RpAtomic *a, float dist) +{ + AlphaObjectInfo item; + item.atomic = a; + item.sort = dist; + return !!m_alphaBoatAtomicList.InsertSorted(item); } // can't increase this yet unfortunately... @@ -243,14 +152,28 @@ CVisibilityPlugins::SetRenderWareCamera(RwCamera *camera) else ms_cullCompsDist = sq(TheCamera.LODDistMultiplier * 20.0f); - ms_vehicleLod0Dist = sq(70.0f * VEHICLE_LODDIST_MULTIPLIER); - ms_vehicleLod1Dist = sq(90.0f * VEHICLE_LODDIST_MULTIPLIER); - ms_vehicleFadeDist = sq(100.0f * VEHICLE_LODDIST_MULTIPLIER); - ms_bigVehicleLod0Dist = sq(60.0f * VEHICLE_LODDIST_MULTIPLIER); - ms_bigVehicleLod1Dist = sq(150.0f * VEHICLE_LODDIST_MULTIPLIER); - ms_pedLod0Dist = sq(25.0f * TheCamera.LODDistMultiplier); - ms_pedLod1Dist = sq(60.0f * TheCamera.LODDistMultiplier); - ms_pedFadeDist = sq(70.0f * TheCamera.LODDistMultiplier); + ms_vehicleLod0Dist = sq(70.0f * VEHICLE_LODDIST_MULTIPLIER); + ms_vehicleLod1Dist = sq(90.0f * VEHICLE_LODDIST_MULTIPLIER); + ms_vehicleFadeDist = sq(100.0f * VEHICLE_LODDIST_MULTIPLIER); + ms_bigVehicleLod0Dist = sq(60.0f * VEHICLE_LODDIST_MULTIPLIER); + ms_bigVehicleLod1Dist = sq(150.0f * VEHICLE_LODDIST_MULTIPLIER); + ms_pedLod1Dist = sq(60.0f * TheCamera.LODDistMultiplier); + ms_pedFadeDist = sq(70.0f * TheCamera.LODDistMultiplier); +} + +static float DistToCameraSq; +static float PitchToCamera; + +void +CVisibilityPlugins::SetupVehicleVariables(RpClump *vehicle) +{ + if (RwObjectGetType((RwObject*)vehicle) != rpCLUMP) + return; + DistToCameraSq = GetDistanceSquaredFromCamera(RpClumpGetFrame(vehicle)); + RwV3d distToCam; + RwV3dSub(&distToCam, ms_pCameraPosn, &RwFrameGetMatrix(RpClumpGetFrame(vehicle))->pos); + float dist2d = Sqrt(SQR(distToCam.x) + SQR(distToCam.y)); + PitchToCamera = Atan2(distToCam.z, dist2d); } RpMaterial* @@ -268,23 +191,33 @@ SetTextureCB(RpMaterial *material, void *data) } void -CVisibilityPlugins::RenderAlphaAtomics(void) +CVisibilityPlugins::RenderAtomicList(CLinkList<AlphaObjectInfo> &list) { CLink<AlphaObjectInfo> *node; - for(node = m_alphaList.tail.prev; - node != &m_alphaList.head; - node = node->prev) + for(node = list.tail.prev; node != &list.head; node = node->prev) RENDERCALLBACK(node->item.atomic); } void -CVisibilityPlugins::RenderFadingEntities(void) +CVisibilityPlugins::RenderAlphaAtomics(void) +{ + RenderAtomicList(m_alphaList); +} + +void +CVisibilityPlugins::RenderBoatAlphaAtomics(void) +{ + SetCullMode(rwCULLMODECULLNONE); + RenderAtomicList(m_alphaBoatAtomicList); + SetCullMode(rwCULLMODECULLBACK); +} + +void +CVisibilityPlugins::RenderFadingEntities(CLinkList<AlphaObjectInfo> &list) { CLink<AlphaObjectInfo> *node; CSimpleModelInfo *mi; - for(node = m_alphaEntityList.tail.prev; - node != &m_alphaEntityList.head; - node = node->prev){ + for(node = list.tail.prev; node != &list.head; node = node->prev){ CEntity *e = node->item.entity; if(e->m_rwObject == nil) continue; @@ -293,19 +226,8 @@ CVisibilityPlugins::RenderFadingEntities(void) continue; #endif mi = (CSimpleModelInfo *)CModelInfo::GetModelInfo(e->GetModelIndex()); - -#ifdef FIX_BUGS if(mi->GetModelType() == MITYPE_SIMPLE && mi->m_noZwrite) -#else - if(mi->m_noZwrite) -#endif RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, FALSE); -#ifdef EXTRA_MODEL_FLAGS - else if(mi->m_bIsTree) - SetAlphaRef(128); - if(!e->IsBuilding() || mi->RenderDoubleSided()) - BACKFACE_CULLING_OFF; -#endif if(e->bDistanceFade){ DeActivateDirectional(); @@ -318,39 +240,34 @@ CVisibilityPlugins::RenderFadingEntities(void) }else CRenderer::RenderOneNonRoad(e); -#ifdef EXTRA_MODEL_FLAGS - if(mi->m_bIsTree) - SetAlphaRef(2); - BACKFACE_CULLING_ON; -#endif -#ifdef FIX_BUGS if(mi->GetModelType() == MITYPE_SIMPLE && mi->m_noZwrite) -#else - if(mi->m_noZwrite) -#endif RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); } } +void +CVisibilityPlugins::RenderFadingEntities(void) +{ + RenderFadingEntities(m_alphaEntityList); + RenderBoatAlphaAtomics(); +} + +void +CVisibilityPlugins::RenderFadingUnderwaterEntities(void) +{ + RenderFadingEntities(m_alphaUnderwaterEntityList); +} + RpAtomic* CVisibilityPlugins::RenderWheelAtomicCB(RpAtomic *atomic) { RpAtomic *lodatm; - RwMatrix *m; - RwV3d view; float len; CSimpleModelInfo *mi; mi = GetAtomicModelInfo(atomic); - m = RwFrameGetLTM(RpAtomicGetFrame(atomic)); - RwV3dSub(&view, RwMatrixGetPos(m), ms_pCameraPosn); - len = RwV3dLength(&view); -#ifdef FIX_BUGS - // from VC + len = Sqrt(DistToCameraSq); lodatm = mi->GetAtomicFromDistance(len * TheCamera.LODDistMultiplier / VEHICLE_LODDIST_MULTIPLIER); -#else - lodatm = mi->GetAtomicFromDistance(len); -#endif if(lodatm){ if(RpAtomicGetGeometry(lodatm) != RpAtomicGetGeometry(atomic)) RpAtomicSetGeometry(atomic, RpAtomicGetGeometry(lodatm), rpATOMICSAMEBOUNDINGSPHERE); @@ -392,6 +309,24 @@ CVisibilityPlugins::RenderAlphaAtomic(RpAtomic *atomic, int alpha) } RpAtomic* +CVisibilityPlugins::RenderWeaponCB(RpAtomic *atomic) +{ + RwMatrix *m; + RwV3d view; + float maxdist, distsq; + CSimpleModelInfo *mi; + + mi = GetAtomicModelInfo(atomic); + m = RwFrameGetLTM(RpAtomicGetFrame(atomic)); + RwV3dSub(&view, RwMatrixGetPos(m), ms_pCameraPosn); + maxdist = mi->GetLodDistance(0); + distsq = RwV3dDotProduct(&view, &view); + if(distsq < maxdist*maxdist) + RENDERCALLBACK(atomic); + return atomic; +} + +RpAtomic* CVisibilityPlugins::RenderFadingAtomic(RpAtomic *atomic, float camdist) { RpAtomic *lodatm; @@ -401,29 +336,30 @@ CVisibilityPlugins::RenderFadingAtomic(RpAtomic *atomic, float camdist) mi = GetAtomicModelInfo(atomic); lodatm = mi->GetAtomicFromDistance(camdist - FADE_DISTANCE); - if(mi->m_additive){ + if(mi->m_additive) RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE); + + fadefactor = (mi->GetLargestLodDistance() - (camdist - FADE_DISTANCE))/FADE_DISTANCE; + if(fadefactor > 1.0f) + fadefactor = 1.0f; + alpha = mi->m_alpha * fadefactor; + if(alpha == 255) RENDERCALLBACK(atomic); - RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); - }else{ - fadefactor = (mi->GetLargestLodDistance() - (camdist - FADE_DISTANCE))/FADE_DISTANCE; - if(fadefactor > 1.0f) - fadefactor = 1.0f; - alpha = mi->m_alpha * fadefactor; - if(alpha == 255) - RENDERCALLBACK(atomic); - else{ - RpGeometry *geo = RpAtomicGetGeometry(lodatm); - uint32 flags = RpGeometryGetFlags(geo); - RpGeometrySetFlags(geo, flags | rpGEOMETRYMODULATEMATERIALCOLOR); - RpGeometryForAllMaterials(geo, SetAlphaCB, (void*)alpha); - if(geo != RpAtomicGetGeometry(atomic)) - RpAtomicSetGeometry(atomic, geo, rpATOMICSAMEBOUNDINGSPHERE); // originally 5 (mistake?) - RENDERCALLBACK(atomic); - RpGeometryForAllMaterials(geo, SetAlphaCB, (void*)255); - RpGeometrySetFlags(geo, flags); - } + else{ + RpGeometry *geo = RpAtomicGetGeometry(lodatm); + uint32 flags = RpGeometryGetFlags(geo); + RpGeometrySetFlags(geo, flags | rpGEOMETRYMODULATEMATERIALCOLOR); + RpGeometryForAllMaterials(geo, SetAlphaCB, (void*)alpha); + if(geo != RpAtomicGetGeometry(atomic)) + RpAtomicSetGeometry(atomic, geo, rpATOMICSAMEBOUNDINGSPHERE); // originally 5 (mistake?) + RENDERCALLBACK(atomic); + RpGeometryForAllMaterials(geo, SetAlphaCB, (void*)255); + RpGeometrySetFlags(geo, flags); } + + if(mi->m_additive) + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); + return atomic; } @@ -433,17 +369,16 @@ RpAtomic* CVisibilityPlugins::RenderVehicleHiDetailCB(RpAtomic *atomic) { RwFrame *clumpframe; - float distsq, dot; + float dot; uint32 flags; clumpframe = RpClumpGetFrame(RpAtomicGetClump(atomic)); - distsq = GetDistanceSquaredFromCamera(clumpframe); - if(distsq < ms_vehicleLod0Dist){ + if(DistToCameraSq < ms_vehicleLod0Dist){ flags = GetAtomicId(atomic); - if(distsq > ms_cullCompsDist && (flags & ATOMIC_FLAG_NOCULL) == 0){ + if(DistToCameraSq > ms_cullCompsDist && (flags & ATOMIC_FLAG_NOCULL) == 0 && PitchToCamera < 0.2f){ dot = GetDotProductWithCameraVector(RwFrameGetLTM(RpAtomicGetFrame(atomic)), RwFrameGetLTM(clumpframe), flags); - if(dot > 0.0f && ((flags & ATOMIC_FLAG_ANGLECULL) || 0.1f*distsq < dot*dot)) + if(dot > 0.0f && ((flags & ATOMIC_FLAG_ANGLECULL) || 0.1f*DistToCameraSq < dot*dot)) return atomic; } RENDERCALLBACK(atomic); @@ -455,25 +390,24 @@ RpAtomic* CVisibilityPlugins::RenderVehicleHiDetailAlphaCB(RpAtomic *atomic) { RwFrame *clumpframe; - float distsq, dot; + float dot; uint32 flags; clumpframe = RpClumpGetFrame(RpAtomicGetClump(atomic)); - distsq = GetDistanceSquaredFromCamera(clumpframe); - if(distsq < ms_vehicleLod0Dist){ + if(DistToCameraSq < ms_vehicleLod0Dist){ flags = GetAtomicId(atomic); dot = GetDotProductWithCameraVector(RwFrameGetLTM(RpAtomicGetFrame(atomic)), RwFrameGetLTM(clumpframe), flags); - if(distsq > ms_cullCompsDist && (flags & ATOMIC_FLAG_NOCULL) == 0) - if(dot > 0.0f && ((flags & ATOMIC_FLAG_ANGLECULL) || 0.1f*distsq < dot*dot)) + if(DistToCameraSq > ms_cullCompsDist && (flags & ATOMIC_FLAG_NOCULL) == 0 && PitchToCamera < 0.2f) + if(dot > 0.0f && ((flags & ATOMIC_FLAG_ANGLECULL) || 0.1f*DistToCameraSq < dot*dot)) return atomic; if(flags & ATOMIC_FLAG_DRAWLAST){ // sort before clump - if(!InsertAtomicIntoSortedList(atomic, distsq - 0.0001f)) + if(!InsertAtomicIntoSortedList(atomic, DistToCameraSq - 0.0001f)) RENDERCALLBACK(atomic); }else{ - if(!InsertAtomicIntoSortedList(atomic, distsq + dot)) + if(!InsertAtomicIntoSortedList(atomic, DistToCameraSq + dot)) RENDERCALLBACK(atomic); } } @@ -484,14 +418,13 @@ RpAtomic* CVisibilityPlugins::RenderVehicleHiDetailCB_BigVehicle(RpAtomic *atomic) { RwFrame *clumpframe; - float distsq, dot; + float dot; uint32 flags; clumpframe = RpClumpGetFrame(RpAtomicGetClump(atomic)); - distsq = GetDistanceSquaredFromCamera(clumpframe); - if(distsq < ms_bigVehicleLod0Dist){ + if(DistToCameraSq < ms_bigVehicleLod0Dist){ flags = GetAtomicId(atomic); - if(distsq > ms_cullCompsDist && (flags & ATOMIC_FLAG_NOCULL) == 0){ + if(DistToCameraSq > ms_cullCompsDist && (flags & ATOMIC_FLAG_NOCULL) == 0 && PitchToCamera < 0.2f){ dot = GetDotProductWithCameraVector(RwFrameGetLTM(RpAtomicGetFrame(atomic)), RwFrameGetLTM(clumpframe), flags); if(dot > 0.0f) @@ -506,20 +439,19 @@ RpAtomic* CVisibilityPlugins::RenderVehicleHiDetailAlphaCB_BigVehicle(RpAtomic *atomic) { RwFrame *clumpframe; - float distsq, dot; + float dot; uint32 flags; clumpframe = RpClumpGetFrame(RpAtomicGetClump(atomic)); - distsq = GetDistanceSquaredFromCamera(clumpframe); - if(distsq < ms_bigVehicleLod0Dist){ + if(DistToCameraSq < ms_bigVehicleLod0Dist){ flags = GetAtomicId(atomic); dot = GetDotProductWithCameraVector(RwFrameGetLTM(RpAtomicGetFrame(atomic)), RwFrameGetLTM(clumpframe), flags); - if(dot > 0.0f) - if(distsq > ms_cullCompsDist && (flags & ATOMIC_FLAG_NOCULL) == 0) + if(DistToCameraSq > ms_cullCompsDist && (flags & ATOMIC_FLAG_NOCULL) == 0 && PitchToCamera < 0.2f) + if(dot > 0.0f && ((flags & ATOMIC_FLAG_ANGLECULL) || 0.1f*DistToCameraSq < dot*dot)) return atomic; - if(!InsertAtomicIntoSortedList(atomic, distsq + dot)) + if(!InsertAtomicIntoSortedList(atomic, DistToCameraSq + dot)) RENDERCALLBACK(atomic); } return atomic; @@ -528,29 +460,53 @@ CVisibilityPlugins::RenderVehicleHiDetailAlphaCB_BigVehicle(RpAtomic *atomic) RpAtomic* CVisibilityPlugins::RenderVehicleHiDetailCB_Boat(RpAtomic *atomic) { - RwFrame *clumpframe; - float distsq; - - clumpframe = RpClumpGetFrame(RpAtomicGetClump(atomic)); - distsq = GetDistanceSquaredFromCamera(clumpframe); - if(distsq < ms_bigVehicleLod1Dist) + if(DistToCameraSq < ms_vehicleLod0Dist) RENDERCALLBACK(atomic); return atomic; } RpAtomic* +CVisibilityPlugins::RenderVehicleHiDetailAlphaCB_Boat(RpAtomic *atomic) +{ + if(DistToCameraSq < ms_vehicleLod0Dist){ + if(GetAtomicId(atomic) & ATOMIC_FLAG_DRAWLAST){ + if(!InsertAtomicIntoBoatSortedList(atomic, DistToCameraSq)) + RENDERCALLBACK(atomic); + }else + RENDERCALLBACK(atomic); + } + return atomic; +} + +RpAtomic* +CVisibilityPlugins::RenderVehicleLoDetailCB_Boat(RpAtomic *atomic) +{ + RpClump *clump; + int32 alpha; + + clump = RpAtomicGetClump(atomic); + if(DistToCameraSq >= ms_vehicleLod0Dist){ + alpha = GetClumpAlpha(clump); + if(alpha == 255) + RENDERCALLBACK(atomic); + else + RenderAlphaAtomic(atomic, alpha); + } + return atomic; +} + +RpAtomic* CVisibilityPlugins::RenderVehicleLowDetailCB_BigVehicle(RpAtomic *atomic) { RwFrame *clumpframe; - float distsq, dot; + float dot; uint32 flags; clumpframe = RpClumpGetFrame(RpAtomicGetClump(atomic)); - distsq = GetDistanceSquaredFromCamera(clumpframe); - if(distsq >= ms_bigVehicleLod0Dist && - distsq < ms_bigVehicleLod1Dist){ + if(DistToCameraSq >= ms_bigVehicleLod0Dist && + DistToCameraSq < ms_bigVehicleLod1Dist){ flags = GetAtomicId(atomic); - if(distsq > ms_cullCompsDist && (flags & ATOMIC_FLAG_NOCULL) == 0){ + if(DistToCameraSq > ms_cullCompsDist && (flags & ATOMIC_FLAG_NOCULL) == 0 && PitchToCamera < 0.2f){ dot = GetDotProductWithCameraVector(RwFrameGetLTM(RpAtomicGetFrame(atomic)), RwFrameGetLTM(clumpframe), flags); if(dot > 0.0f) @@ -565,21 +521,20 @@ RpAtomic* CVisibilityPlugins::RenderVehicleLowDetailAlphaCB_BigVehicle(RpAtomic *atomic) { RwFrame *clumpframe; - float distsq, dot; + float dot; uint32 flags; clumpframe = RpClumpGetFrame(RpAtomicGetClump(atomic)); - distsq = GetDistanceSquaredFromCamera(clumpframe); - if(distsq >= ms_bigVehicleLod0Dist && - distsq < ms_bigVehicleLod1Dist){ + if(DistToCameraSq >= ms_bigVehicleLod0Dist && + DistToCameraSq < ms_bigVehicleLod1Dist){ flags = GetAtomicId(atomic); dot = GetDotProductWithCameraVector(RwFrameGetLTM(RpAtomicGetFrame(atomic)), RwFrameGetLTM(clumpframe), flags); if(dot > 0.0f) - if(distsq > ms_cullCompsDist && (flags & ATOMIC_FLAG_NOCULL) == 0) + if(DistToCameraSq > ms_cullCompsDist && (flags & ATOMIC_FLAG_NOCULL) == 0 && PitchToCamera < 0.2f) return atomic; - if(!InsertAtomicIntoSortedList(atomic, distsq + dot)) + if(!InsertAtomicIntoSortedList(atomic, DistToCameraSq + dot)) RENDERCALLBACK(atomic); } return atomic; @@ -589,12 +544,10 @@ RpAtomic* CVisibilityPlugins::RenderVehicleReallyLowDetailCB(RpAtomic *atomic) { RpClump *clump; - float dist; int32 alpha; clump = RpAtomicGetClump(atomic); - dist = GetDistanceSquaredFromCamera(RpClumpGetFrame(clump)); - if(dist >= ms_vehicleLod0Dist){ + if(DistToCameraSq >= ms_vehicleLod0Dist){ alpha = GetClumpAlpha(clump); if(alpha == 255) RENDERCALLBACK(atomic); @@ -608,12 +561,7 @@ CVisibilityPlugins::RenderVehicleReallyLowDetailCB(RpAtomic *atomic) RpAtomic* CVisibilityPlugins::RenderVehicleReallyLowDetailCB_BigVehicle(RpAtomic *atomic) { - RwFrame *clumpframe; - float distsq; - - clumpframe = RpClumpGetFrame(RpAtomicGetClump(atomic)); - distsq = GetDistanceSquaredFromCamera(clumpframe); - if(distsq >= ms_bigVehicleLod1Dist) + if(DistToCameraSq >= ms_bigVehicleLod1Dist) RENDERCALLBACK(atomic); return atomic; } @@ -622,17 +570,16 @@ RpAtomic* CVisibilityPlugins::RenderTrainHiDetailCB(RpAtomic *atomic) { RwFrame *clumpframe; - float distsq, dot; + float dot; uint32 flags; clumpframe = RpClumpGetFrame(RpAtomicGetClump(atomic)); - distsq = GetDistanceSquaredFromCamera(clumpframe); - if(distsq < ms_bigVehicleLod1Dist){ + if(DistToCameraSq < ms_bigVehicleLod1Dist){ flags = GetAtomicId(atomic); - if(distsq > ms_cullCompsDist && (flags & ATOMIC_FLAG_NOCULL) == 0){ + if(DistToCameraSq > ms_cullCompsDist && (flags & ATOMIC_FLAG_NOCULL) == 0 && PitchToCamera < 0.2f){ dot = GetDotProductWithCameraVector(RwFrameGetLTM(RpAtomicGetFrame(atomic)), RwFrameGetLTM(clumpframe), flags); - if(dot > 0.0f && ((flags & ATOMIC_FLAG_ANGLECULL) || 0.1f*distsq < dot*dot)) + if(dot > 0.0f && ((flags & ATOMIC_FLAG_ANGLECULL) || 0.1f*DistToCameraSq < dot*dot)) return atomic; } RENDERCALLBACK(atomic); @@ -644,24 +591,23 @@ RpAtomic* CVisibilityPlugins::RenderTrainHiDetailAlphaCB(RpAtomic *atomic) { RwFrame *clumpframe; - float distsq, dot; + float dot; uint32 flags; clumpframe = RpClumpGetFrame(RpAtomicGetClump(atomic)); - distsq = GetDistanceSquaredFromCamera(clumpframe); - if(distsq < ms_bigVehicleLod1Dist){ + if(DistToCameraSq < ms_bigVehicleLod1Dist){ flags = GetAtomicId(atomic); dot = GetDotProductWithCameraVector(RwFrameGetLTM(RpAtomicGetFrame(atomic)), RwFrameGetLTM(clumpframe), flags); - if(distsq > ms_cullCompsDist && (flags & ATOMIC_FLAG_NOCULL) == 0) - if(dot > 0.0f && ((flags & ATOMIC_FLAG_ANGLECULL) || 0.1f*distsq < dot*dot)) + if(DistToCameraSq > ms_cullCompsDist && (flags & ATOMIC_FLAG_NOCULL) == 0 && PitchToCamera < 0.2f) + if(dot > 0.0f && ((flags & ATOMIC_FLAG_ANGLECULL) || 0.1f*DistToCameraSq < dot*dot)) return atomic; if(flags & ATOMIC_FLAG_DRAWLAST){ - if(!InsertAtomicIntoSortedList(atomic, distsq)) + if(!InsertAtomicIntoSortedList(atomic, DistToCameraSq)) RENDERCALLBACK(atomic); }else{ - if(!InsertAtomicIntoSortedList(atomic, distsq + dot)) + if(!InsertAtomicIntoSortedList(atomic, DistToCameraSq + dot)) RENDERCALLBACK(atomic); } } @@ -669,35 +615,51 @@ CVisibilityPlugins::RenderTrainHiDetailAlphaCB(RpAtomic *atomic) } RpAtomic* -CVisibilityPlugins::RenderPlayerCB(RpAtomic *atomic) +CVisibilityPlugins::RenderVehicleRotorAlphaCB(RpAtomic *atomic) { - if(CWorld::Players[0].m_pSkinTexture) - RpGeometryForAllMaterials(RpAtomicGetGeometry(atomic), SetTextureCB, CWorld::Players[0].m_pSkinTexture); - RENDERCALLBACK(atomic); + RwFrame *clumpframe; + float dot; + RwV3d cam2atm; + + clumpframe = RpClumpGetFrame(RpAtomicGetClump(atomic)); + if(DistToCameraSq < ms_bigVehicleLod1Dist){ + RwV3dSub(&cam2atm, &RwFrameGetLTM(RpAtomicGetFrame(atomic))->pos, ms_pCameraPosn); + dot = RwV3dDotProduct(&cam2atm, &RwFrameGetLTM(clumpframe)->at); + if(!InsertAtomicIntoSortedList(atomic, DistToCameraSq + dot*20.0f)) + RENDERCALLBACK(atomic); + } return atomic; } RpAtomic* -CVisibilityPlugins::RenderPedLowDetailCB(RpAtomic *atomic) +CVisibilityPlugins::RenderVehicleTailRotorAlphaCB(RpAtomic *atomic) { - RpClump *clump; - float dist; - int32 alpha; + RwMatrix *clumpMat, *atmMat; + float dot; + RwV3d cam2atm; - clump = RpAtomicGetClump(atomic); - dist = GetDistanceSquaredFromCamera(RpClumpGetFrame(clump)); - if(dist >= ms_pedLod0Dist){ - alpha = GetClumpAlpha(clump); - if(alpha == 255) + if(DistToCameraSq < ms_bigVehicleLod0Dist){ + atmMat = RwFrameGetLTM(RpAtomicGetFrame(atomic)); + clumpMat = RwFrameGetLTM(RpClumpGetFrame(RpAtomicGetClump(atomic))); + RwV3dSub(&cam2atm, &atmMat->pos, ms_pCameraPosn); + dot = RwV3dDotProduct(&cam2atm, &clumpMat->up) + RwV3dDotProduct(&cam2atm, &clumpMat->right); + if(!InsertAtomicIntoSortedList(atomic, DistToCameraSq - dot)) RENDERCALLBACK(atomic); - else - RenderAlphaAtomic(atomic, alpha); } return atomic; } RpAtomic* -CVisibilityPlugins::RenderPedHiDetailCB(RpAtomic *atomic) +CVisibilityPlugins::RenderPlayerCB(RpAtomic *atomic) +{ + if(CWorld::Players[0].m_pSkinTexture) + RpGeometryForAllMaterials(RpAtomicGetGeometry(atomic), SetTextureCB, CWorld::Players[0].m_pSkinTexture); + RENDERCALLBACK(atomic); + return atomic; +} + +RpAtomic* +CVisibilityPlugins::RenderPedCB(RpAtomic *atomic) { RpClump *clump; float dist; @@ -705,7 +667,7 @@ CVisibilityPlugins::RenderPedHiDetailCB(RpAtomic *atomic) clump = RpAtomicGetClump(atomic); dist = GetDistanceSquaredFromCamera(RpClumpGetFrame(clump)); - if(dist < ms_pedLod0Dist){ + if(dist < ms_pedLod1Dist){ alpha = GetClumpAlpha(clump); if(alpha == 255) RENDERCALLBACK(atomic); @@ -715,23 +677,12 @@ CVisibilityPlugins::RenderPedHiDetailCB(RpAtomic *atomic) return atomic; } -// This is needed for peds with only one clump, i.e. skinned models -// strangely even the xbox version has no such thing -RpAtomic* -CVisibilityPlugins::RenderPedCB(RpAtomic *atomic) +float +CVisibilityPlugins::GetDistanceSquaredFromCamera(RwV3d *pos) { - int32 alpha; - RwV3d cam2atm; - - RwV3dSub(&cam2atm, &RwFrameGetLTM(RpAtomicGetFrame(atomic))->pos, ms_pCameraPosn); - if(RwV3dDotProduct(&cam2atm, &cam2atm) < ms_pedLod1Dist){ - alpha = GetClumpAlpha(RpAtomicGetClump(atomic)); - if(alpha == 255) - RENDERCALLBACK(atomic); - else - RenderAlphaAtomic(atomic, alpha); - } - return atomic; + RwV3d dist; + RwV3dSub(&dist, pos, ms_pCameraPosn); + return RwV3dDotProduct(&dist, &dist); } float @@ -858,11 +809,6 @@ CVisibilityPlugins::PluginAttach(void) ms_clumpPluginOffset = RpClumpRegisterPlugin(sizeof(ClumpExt), ID_VISIBILITYCLUMP, ClumpConstructor, ClumpDestructor, ClumpCopyConstructor); - -#if GTA_VERSION <= GTA3_PS2_160 - Initialise(); -#endif - return ms_atomicPluginOffset != -1 && ms_clumpPluginOffset != -1; } @@ -900,13 +846,6 @@ CVisibilityPlugins::SetAtomicModelInfo(RpAtomic *atomic, { AtomicExt *ext = ATOMICEXT(atomic); ext->modelInfo = modelInfo; - switch (modelInfo->GetModelType()) { - case MITYPE_SIMPLE: - case MITYPE_TIME: - if(modelInfo->m_normalCull) - SetAtomicRenderCallback(atomic, RenderObjNormalAtomic); - default: break; - } } CSimpleModelInfo* @@ -943,7 +882,7 @@ void CVisibilityPlugins::SetAtomicRenderCallback(RpAtomic *atomic, RpAtomicCallBackRender cb) { if(cb == nil) - cb = RENDERCALLBACK; + cb = RENDERCALLBACK; // not necessary RpAtomicSetRenderCallBack(atomic, cb); } diff --git a/src/rw/VisibilityPlugins.h b/src/rw/VisibilityPlugins.h index f97fd589..90afc0f5 100644 --- a/src/rw/VisibilityPlugins.h +++ b/src/rw/VisibilityPlugins.h @@ -21,7 +21,9 @@ public: }; static CLinkList<AlphaObjectInfo> m_alphaList; + static CLinkList<AlphaObjectInfo> m_alphaBoatAtomicList; static CLinkList<AlphaObjectInfo> m_alphaEntityList; + static CLinkList<AlphaObjectInfo> m_alphaUnderwaterEntityList; #ifdef NEW_RENDERER static CLinkList<AlphaObjectInfo> m_alphaBuildingList; #endif @@ -33,7 +35,6 @@ public: static float ms_vehicleFadeDist; static float ms_bigVehicleLod0Dist; static float ms_bigVehicleLod1Dist; - static float ms_pedLod0Dist; static float ms_pedLod1Dist; static float ms_pedFadeDist; @@ -43,12 +44,15 @@ public: static bool InsertEntityIntoSortedList(CEntity *e, float dist); static void InitAlphaAtomicList(void); static bool InsertAtomicIntoSortedList(RpAtomic *a, float dist); + static bool InsertAtomicIntoBoatSortedList(RpAtomic *a, float dist); static void SetRenderWareCamera(RwCamera *camera); + static void SetupVehicleVariables(RpClump *vehicle); static RpAtomic *RenderWheelAtomicCB(RpAtomic *atomic); static RpAtomic *RenderObjNormalAtomic(RpAtomic *atomic); static RpAtomic *RenderAlphaAtomic(RpAtomic *atomic, int alpha); + static RpAtomic *RenderWeaponCB(RpAtomic *atomic); static RpAtomic *RenderFadingAtomic(RpAtomic *atm, float dist); static RpAtomic *RenderVehicleHiDetailCB(RpAtomic *atomic); @@ -56,20 +60,26 @@ public: static RpAtomic *RenderVehicleHiDetailCB_BigVehicle(RpAtomic *atomic); static RpAtomic *RenderVehicleHiDetailAlphaCB_BigVehicle(RpAtomic *atomic); static RpAtomic *RenderVehicleHiDetailCB_Boat(RpAtomic *atomic); + static RpAtomic *RenderVehicleHiDetailAlphaCB_Boat(RpAtomic *atomic); + static RpAtomic *RenderVehicleLoDetailCB_Boat(RpAtomic *atomic); static RpAtomic *RenderVehicleLowDetailCB_BigVehicle(RpAtomic *atomic); static RpAtomic *RenderVehicleLowDetailAlphaCB_BigVehicle(RpAtomic *atomic); static RpAtomic *RenderVehicleReallyLowDetailCB(RpAtomic *atomic); static RpAtomic *RenderVehicleReallyLowDetailCB_BigVehicle(RpAtomic *atomic); static RpAtomic *RenderTrainHiDetailCB(RpAtomic *atomic); static RpAtomic *RenderTrainHiDetailAlphaCB(RpAtomic *atomic); + static RpAtomic *RenderVehicleRotorAlphaCB(RpAtomic *atomic); + static RpAtomic *RenderVehicleTailRotorAlphaCB(RpAtomic *atomic); static RpAtomic *RenderPlayerCB(RpAtomic *atomic); - static RpAtomic *RenderPedLowDetailCB(RpAtomic *atomic); - static RpAtomic *RenderPedHiDetailCB(RpAtomic *atomic); static RpAtomic *RenderPedCB(RpAtomic *atomic); // for skinned models with only one clump + static void RenderAtomicList(CLinkList<AlphaObjectInfo> &list); static void RenderAlphaAtomics(void); + static void RenderBoatAlphaAtomics(void); + static void RenderFadingEntities(CLinkList<AlphaObjectInfo> &list); static void RenderFadingEntities(void); + static void RenderFadingUnderwaterEntities(void); // All actually unused static bool DefaultVisibilityCB(RpClump *clump); @@ -78,6 +88,7 @@ public: static bool VehicleVisibilityCB(RpClump *clump); static bool VehicleVisibilityCB_BigVehicle(RpClump *clump); + static float GetDistanceSquaredFromCamera(RwV3d *pos); static float GetDistanceSquaredFromCamera(RwFrame *frame); static float GetDotProductWithCameraVector(RwMatrix *atomicMat, RwMatrix *clumpMat, uint32 flags); |