summaryrefslogtreecommitdiffstats
path: root/src/rw
diff options
context:
space:
mode:
Diffstat (limited to 'src/rw')
-rw-r--r--src/rw/Lights.cpp7
-rw-r--r--src/rw/RwHelper.cpp2
-rw-r--r--src/rw/TexRead.cpp12
-rw-r--r--src/rw/TxdStore.cpp93
-rw-r--r--src/rw/TxdStore.h11
-rw-r--r--src/rw/VisibilityPlugins.cpp91
-rw-r--r--src/rw/VisibilityPlugins.h16
7 files changed, 197 insertions, 35 deletions
diff --git a/src/rw/Lights.cpp b/src/rw/Lights.cpp
index 772e1961..5f8ba823 100644
--- a/src/rw/Lights.cpp
+++ b/src/rw/Lights.cpp
@@ -24,12 +24,7 @@ RwRGBAReal DirectionalLightColourForFrame;
RwRGBAReal AmbientLightColour;
RwRGBAReal DirectionalLightColour;
-#ifdef EXTENDED_COLOURFILTER
-#include "postfx.h"
-#define USEBLURCOLORS CPostFX::UseBlurColours()
-#else
-#define USEBLURCOLORS CMBlur::BlurOn
-#endif
+#define USEBLURCOLORS true // actually CMBlur::BlurOn, but that's always supposed to be on
void
SetLightsWithTimeOfDayColour(RpWorld *)
diff --git a/src/rw/RwHelper.cpp b/src/rw/RwHelper.cpp
index 69f57933..6021b866 100644
--- a/src/rw/RwHelper.cpp
+++ b/src/rw/RwHelper.cpp
@@ -18,7 +18,7 @@ bool gPS2alphaTest = true;
#else
bool gPS2alphaTest = false;
#endif
-bool gBackfaceCulling = true;
+bool gBackfaceCulling = false; // can we ever enable this in LCS even?
#if !defined(FINAL) || defined(DEBUGMENU)
static bool charsetOpen;
diff --git a/src/rw/TexRead.cpp b/src/rw/TexRead.cpp
index 1f96180b..ddb178e2 100644
--- a/src/rw/TexRead.cpp
+++ b/src/rw/TexRead.cpp
@@ -321,11 +321,7 @@ 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(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(97, 194, 247, 255));
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();
@@ -334,11 +330,7 @@ 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::SetColor(CRGBA(115, 173, 216, 255));
CFont::SetBackGroundOnlyTextOff();
CFont::SetFontStyle(FONT_STANDARD);
CFont::PrintString(SCREEN_SCALE_X(170.0f), SCREEN_SCALE_Y(160.0f), TheText.Get(text));
diff --git a/src/rw/TxdStore.cpp b/src/rw/TxdStore.cpp
index 0bd29718..b7936bcf 100644
--- a/src/rw/TxdStore.cpp
+++ b/src/rw/TxdStore.cpp
@@ -1,5 +1,7 @@
#include "common.h"
+#include "main.h"
+#include "smallHeap.h"
#include "templates.h"
#include "General.h"
#include "Streaming.h"
@@ -9,13 +11,19 @@
CPool<TxdDef,TxdDef> *CTxdStore::ms_pTxdPool;
RwTexDictionary *CTxdStore::ms_pStoredTxd;
+// LCS: file done except unused:
+// CTexListStore::RemoveTexListChunk(int)
+// CTexListStore::validateRefs(void)
+// CTexListStore::Write(base::cRelocatableChunkWriter &)
+
void
CTxdStore::Initialise(void)
{
- if(ms_pTxdPool == nil)
+ if(gMakeResources && ms_pTxdPool == nil)
ms_pTxdPool = new CPool<TxdDef,TxdDef>(TXDSTORESIZE, "TexDictionary");
}
+// removed in LCS but we should probably keep it
void
CTxdStore::Shutdown(void)
{
@@ -23,6 +31,7 @@ CTxdStore::Shutdown(void)
delete ms_pTxdPool;
}
+// removed in LCS but we should probably keep it
void
CTxdStore::GameShutdown(void)
{
@@ -42,6 +51,7 @@ CTxdStore::AddTxdSlot(const char *name)
assert(def);
def->texDict = nil;
def->refCount = 0;
+ def->refCountGu = 0;
strcpy(def->name, name);
return ms_pTxdPool->GetJustIndex(def);
}
@@ -95,7 +105,11 @@ CTxdStore::SetCurrentTxd(int slot)
void
CTxdStore::Create(int slot)
{
- GetSlot(slot)->texDict = RwTexDictionaryCreate();
+ TxdDef *def = GetSlot(slot);
+ def->texDict = RwTexDictionaryCreate();
+ // LCS: mobile sets the txd name here, but txds don't really have names
+ def->refCount = 0;
+ def->refCountGu = 0;
}
int
@@ -111,6 +125,20 @@ CTxdStore::AddRef(int slot)
}
void
+CTxdStore::AddRefEvenIfNotInMemory(int slot)
+{
+ GetSlot(slot)->refCount++;
+}
+
+void
+CTxdStore::AddRefGu(int slot)
+{
+ TxdDef *def = GetSlot(slot);
+ def->refCount++;
+ def->refCountGu++;
+}
+
+void
CTxdStore::RemoveRef(int slot)
{
if(--GetSlot(slot)->refCount <= 0)
@@ -118,6 +146,15 @@ CTxdStore::RemoveRef(int slot)
}
void
+CTxdStore::RemoveRefGu(int slot)
+{
+ TxdDef *def = GetSlot(slot);
+ def->refCount--;
+ if(gUseChunkFiles)
+ def->refCountGu--;
+}
+
+void
CTxdStore::RemoveRefWithoutDelete(int slot)
{
GetSlot(slot)->refCount--;
@@ -128,15 +165,32 @@ CTxdStore::LoadTxd(int slot, RwStream *stream)
{
TxdDef *def = GetSlot(slot);
- if(RwStreamFindChunk(stream, rwID_TEXDICTIONARY, nil, nil)){
- def->texDict = RwTexDictionaryGtaStreamRead(stream);
- return def->texDict != nil;
+ if(stream){
+ if(RwStreamFindChunk(stream, rwID_TEXDICTIONARY, nil, nil)){
+ def->texDict = RwTexDictionaryGtaStreamRead(stream);
+ return def->texDict != nil;
+ }
+ }else{
+ // TODO(LCS)? fall back reading from file
}
printf("Failed to load TXD\n");
return false;
}
bool
+CTxdStore::LoadTxd(int slot, void *data, void *chunk)
+{
+ TxdDef *def = GetSlot(slot);
+ def->texDict = (RwTexDictionary*)data;
+ if(strncasecmp(def->name, "radar", 5) == 0){
+ def->refCount = 0;
+ def->refCountGu = 0;
+ }
+ CStreaming::RegisterPointer(&def->texDict, 3, true);
+ return def->texDict != nil;
+}
+
+bool
CTxdStore::LoadTxd(int slot, const char *filename)
{
RwStream *stream;
@@ -152,6 +206,7 @@ CTxdStore::LoadTxd(int slot, const char *filename)
return ret;
}
+// removed in LCS but we should probably keep it
bool
CTxdStore::StartLoadTxd(int slot, RwStream *stream)
{
@@ -165,6 +220,7 @@ CTxdStore::StartLoadTxd(int slot, RwStream *stream)
}
}
+// removed in LCS but we should probably keep it
bool
CTxdStore::FinishLoadTxd(int slot, RwStream *stream)
{
@@ -174,10 +230,31 @@ CTxdStore::FinishLoadTxd(int slot, RwStream *stream)
}
void
-CTxdStore::RemoveTxd(int slot)
+CTxdStore::RemoveTxd(int slot, bool notChunk)
{
TxdDef *def = GetSlot(slot);
- if(def->texDict)
- RwTexDictionaryDestroy(def->texDict);
+ if(def->texDict){
+ if(!gUseChunkFiles || notChunk)
+ RwTexDictionaryDestroy(def->texDict);
+ else{
+ // TODO? Rsl3D specific: RslTextureDestroyDispList for all textures
+ CStreaming::UnregisterPointer(&def->texDict, 3);
+ cSmallHeap::msInstance.Free(def->texDict);
+ }
+ }
def->texDict = nil;
+ def->refCount = 0;
+ def->refCountGu = 0;
+}
+
+void
+CTxdStore::Load(RwTexDictionary *stored, CPool<TxdDef> *pool)
+{
+ ms_pTxdPool = pool;
+ ms_pStoredTxd = stored;
+ for(int i = 0; i < TXDSTORESIZE; i++){
+ TxdDef *def = GetSlot(i);
+ if(def)
+ def->refCount = def->texDict != nil;
+ }
}
diff --git a/src/rw/TxdStore.h b/src/rw/TxdStore.h
index 937fd1b7..31fcf87f 100644
--- a/src/rw/TxdStore.h
+++ b/src/rw/TxdStore.h
@@ -4,7 +4,8 @@
struct TxdDef {
RwTexDictionary *texDict;
- int refCount;
+ int16 refCount;
+ int16 refCountGu;
char name[20];
};
@@ -26,13 +27,19 @@ public:
static void Create(int slot);
static int GetNumRefs(int slot);
static void AddRef(int slot);
+ static void AddRefEvenIfNotInMemory(int slot);
+ static void AddRefGu(int slot);
static void RemoveRef(int slot);
+ static void RemoveRefGu(int slot);
static void RemoveRefWithoutDelete(int slot);
static bool LoadTxd(int slot, RwStream *stream);
+ static bool LoadTxd(int slot, void *data, void *chunk);
static bool LoadTxd(int slot, const char *filename);
static bool StartLoadTxd(int slot, RwStream *stream);
static bool FinishLoadTxd(int slot, RwStream *stream);
- static void RemoveTxd(int slot);
+ static void RemoveTxd(int slot, bool notChunk = false);
+
+ static void Load(RwTexDictionary *stored, CPool<TxdDef> *pool);
static TxdDef *GetSlot(int slot) {
assert(slot >= 0);
diff --git a/src/rw/VisibilityPlugins.cpp b/src/rw/VisibilityPlugins.cpp
index 01db546c..ffd7b18a 100644
--- a/src/rw/VisibilityPlugins.cpp
+++ b/src/rw/VisibilityPlugins.cpp
@@ -267,6 +267,7 @@ CVisibilityPlugins::RenderWheelAtomicCB(RpAtomic *atomic)
mi = GetAtomicModelInfo(atomic);
len = Sqrt(DistToCameraSq);
+ len *= 0.5f; // HACK HACK, LOD wheels look shite
lodatm = mi->GetAtomicFromDistance(len * TheCamera.LODDistMultiplier / VEHICLE_LODDIST_MULTIPLIER);
if(lodatm){
if(RpAtomicGetGeometry(lodatm) != RpAtomicGetGeometry(atomic))
@@ -466,6 +467,14 @@ CVisibilityPlugins::RenderVehicleHiDetailCB_Boat(RpAtomic *atomic)
}
RpAtomic*
+CVisibilityPlugins::RenderVehicleHiDetailCB_Boat_Far(RpAtomic *atomic)
+{
+ if(DistToCameraSq < ms_bigVehicleLod1Dist)
+ RENDERCALLBACK(atomic);
+ return atomic;
+}
+
+RpAtomic*
CVisibilityPlugins::RenderVehicleHiDetailAlphaCB_Boat(RpAtomic *atomic)
{
if(DistToCameraSq < ms_vehicleLod0Dist){
@@ -496,6 +505,23 @@ CVisibilityPlugins::RenderVehicleLoDetailCB_Boat(RpAtomic *atomic)
}
RpAtomic*
+CVisibilityPlugins::RenderVehicleLoDetailCB_Boat_Far(RpAtomic *atomic)
+{
+ RpClump *clump;
+ int32 alpha;
+
+ clump = RpAtomicGetClump(atomic);
+ if(DistToCameraSq >= ms_bigVehicleLod1Dist){
+ alpha = GetClumpAlpha(clump);
+ if(alpha == 255)
+ RENDERCALLBACK(atomic);
+ else
+ RenderAlphaAtomic(atomic, alpha);
+ }
+ return atomic;
+}
+
+RpAtomic*
CVisibilityPlugins::RenderVehicleLowDetailCB_BigVehicle(RpAtomic *atomic)
{
RwFrame *clumpframe;
@@ -653,8 +679,9 @@ CVisibilityPlugins::RenderVehicleTailRotorAlphaCB(RpAtomic *atomic)
RpAtomic*
CVisibilityPlugins::RenderPlayerCB(RpAtomic *atomic)
{
- if(CWorld::Players[0].m_pSkinTexture)
- RpGeometryForAllMaterials(RpAtomicGetGeometry(atomic), SetTextureCB, CWorld::Players[0].m_pSkinTexture);
+// LCS: removed
+// if(CWorld::Players[0].m_pSkinTexture)
+// RpGeometryForAllMaterials(RpAtomicGetGeometry(atomic), SetTextureCB, CWorld::Players[0].m_pSkinTexture);
RENDERCALLBACK(atomic);
return atomic;
}
@@ -800,9 +827,9 @@ CVisibilityPlugins::PluginAttach(void)
return ms_atomicPluginOffset != -1 && ms_clumpPluginOffset != -1;
}
-#define ATOMICEXT(o) (RWPLUGINOFFSET(AtomicExt, o, ms_atomicPluginOffset))
-#define FRAMEEXT(o) (RWPLUGINOFFSET(FrameExt, o, ms_framePluginOffset))
-#define CLUMPEXT(o) (RWPLUGINOFFSET(ClumpExt, o, ms_clumpPluginOffset))
+#define ATOMICEXT(o) (RWPLUGINOFFSET(CVisibilityPlugins::AtomicExt, o, CVisibilityPlugins::ms_atomicPluginOffset))
+#define FRAMEEXT(o) (RWPLUGINOFFSET(CVisibilityPlugins::FrameExt, o, CVisibilityPlugins::ms_framePluginOffset))
+#define CLUMPEXT(o) (RWPLUGINOFFSET(CVisibilityPlugins::ClumpExt, o, CVisibilityPlugins::ms_clumpPluginOffset))
//
// Atomic
@@ -812,6 +839,7 @@ void*
CVisibilityPlugins::AtomicConstructor(void *object, int32, int32)
{
ATOMICEXT(object)->modelInfo = nil;
+ ATOMICEXT(object)->distanceAlpha = 255;
return object;
}
@@ -964,3 +992,56 @@ CVisibilityPlugins::GetClumpAlpha(RpClump *clump)
{
return CLUMPEXT(clump)->alpha;
}
+
+// LCS walks the atomic list manually but we want to be compatible with both RW and librw,
+// so this code isn't quite original and uses callbacks instead.
+static RpAtomic*
+SetAtomicDistanceAlphaCB(RpAtomic *atomic, void *data)
+{
+ ATOMICEXT(atomic)->distanceAlpha = *(int*)data;
+ return atomic;
+}
+void
+CVisibilityPlugins::SetClumpDistanceAlpha(RpClump *clump, int alpha)
+{
+ RpClumpForAllAtomics(clump, SetAtomicDistanceAlphaCB, &alpha);
+}
+
+static RpAtomic*
+GetAtomicDistanceAlphaCB(RpAtomic *atomic, void *data)
+{
+ *(int*)data = ATOMICEXT(atomic)->distanceAlpha;
+ return atomic;
+}
+int
+CVisibilityPlugins::GetClumpDistanceAlpha(RpClump *clump)
+{
+ int alpha = 255;
+ RpClumpForAllAtomics(clump, GetAtomicDistanceAlphaCB, &alpha);
+ return alpha;
+}
+
+
+
+
+void
+CVisibilityPlugins::SetObjectDistanceAlpha(RwObject *object, int alpha)
+{
+ if(object == nil)
+ return;
+ if(RwObjectGetType(object) == rpATOMIC)
+ ATOMICEXT(object)->distanceAlpha = alpha;
+ else
+ SetClumpDistanceAlpha((RpClump*)object, alpha);
+}
+
+int
+CVisibilityPlugins::GetObjectDistanceAlpha(RwObject *object)
+{
+ if(object == nil)
+ return 255;
+ if(RwObjectGetType(object) == rpATOMIC)
+ return ATOMICEXT(object)->distanceAlpha;
+ else
+ return GetClumpDistanceAlpha((RpClump*)object);
+}
diff --git a/src/rw/VisibilityPlugins.h b/src/rw/VisibilityPlugins.h
index d375044b..3a3e555b 100644
--- a/src/rw/VisibilityPlugins.h
+++ b/src/rw/VisibilityPlugins.h
@@ -61,7 +61,9 @@ public:
static RpAtomic *RenderVehicleHiDetailAlphaCB_BigVehicle(RpAtomic *atomic);
static RpAtomic *RenderVehicleHiDetailCB_Boat(RpAtomic *atomic);
static RpAtomic *RenderVehicleHiDetailAlphaCB_Boat(RpAtomic *atomic);
+ static RpAtomic *RenderVehicleHiDetailCB_Boat_Far(RpAtomic *atomic);
static RpAtomic *RenderVehicleLoDetailCB_Boat(RpAtomic *atomic);
+ static RpAtomic *RenderVehicleLoDetailCB_Boat_Far(RpAtomic *atomic);
static RpAtomic *RenderVehicleLowDetailCB_BigVehicle(RpAtomic *atomic);
static RpAtomic *RenderVehicleLowDetailAlphaCB_BigVehicle(RpAtomic *atomic);
static RpAtomic *RenderVehicleReallyLowDetailCB(RpAtomic *atomic);
@@ -95,10 +97,13 @@ public:
// RW Plugins
//
- union AtomicExt
+ struct AtomicExt
{
- CSimpleModelInfo *modelInfo; // used by SimpleModelInfo
- int flags; // used by ClumpModelInfo
+ union {
+ CSimpleModelInfo *modelInfo; // used by SimpleModelInfo
+ int flags; // used by ClumpModelInfo
+ };
+ int distanceAlpha; // not sure where this is in PS2/PSP LCS
};
static void SetAtomicModelInfo(RpAtomic*, CSimpleModelInfo*);
static CSimpleModelInfo *GetAtomicModelInfo(RpAtomic *atomic);
@@ -135,6 +140,8 @@ public:
static void SetClumpModelInfo(RpClump*, CClumpModelInfo*);
static void SetClumpAlpha(RpClump*, int);
static int GetClumpAlpha(RpClump*);
+ static void SetClumpDistanceAlpha(RpClump*, int);
+ static int GetClumpDistanceAlpha(RpClump*);
static void *ClumpConstructor(void *object, int32 offset, int32 len);
static void *ClumpDestructor(void *object, int32 offset, int32 len);
@@ -142,6 +149,9 @@ public:
int32 offset, int32 len);
static int32 ms_clumpPluginOffset;
+ static void SetObjectDistanceAlpha(RwObject *object, int alpha);
+ static int GetObjectDistanceAlpha(RwObject *object);
+
static bool PluginAttach(void);
};