Compare commits
24 Commits
ph3nom/tex
...
skmp/compa
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8a0c737284 | ||
|
|
87bfbcab2d | ||
|
|
bdc27bf2fc | ||
|
|
1ee51d5136 | ||
|
|
725d60a9fb | ||
|
|
05e9e7452e | ||
|
|
51b21c02b9 | ||
|
|
86806215a5 | ||
|
|
a056fdecc7 | ||
|
|
b6d5c628b2 | ||
|
|
8c81349c69 | ||
|
|
282b639a4c | ||
|
|
69f9bbcf7b | ||
|
|
40f212e131 | ||
|
|
43c0e99ebf | ||
|
|
42647ddc6b | ||
|
|
b3ccf1f900 | ||
|
|
baf7612fcf | ||
|
|
33b9dd1c8a | ||
|
|
5786eeecb8 | ||
|
|
20864fdac6 | ||
|
|
1587d707a8 | ||
|
|
911b93bd0f | ||
|
|
e86fb27a48 |
@@ -79,6 +79,9 @@ OBJS_TEXCONV += \
|
||||
../vendor/librw/src/d3d-x/d3d.texconv.o \
|
||||
../vendor/librw/src/d3d-x/d3d8.texconv.o \
|
||||
../vendor/librw/src/d3d-x/d3d8render.texconv.o \
|
||||
../vendor/librw/src/bmp.texconv.o \
|
||||
../vendor/librw/src/png.texconv.o \
|
||||
../vendor/librw/src/lodepng/lodepng.texconv.o
|
||||
|
||||
# Add compilation units to this list to explicity compile them with
|
||||
# -O3 optimizations, while the rest get the default (-Os) treatment
|
||||
@@ -316,6 +319,22 @@ TXD_OPTS_NEWS = 512 512
|
||||
TXD_OPTS_SPLASH1 = 512 512
|
||||
TXD_OPTS_SPLASH2 = 512 512
|
||||
TXD_OPTS_SPLASH3 = 512 512
|
||||
TXD_OPTS_frontend = 512 512 \
|
||||
--delete-tex "fe_arrows4" \
|
||||
--delete-tex "fe_arrows2" \
|
||||
--delete-tex "fe_arrows1" \
|
||||
--delete-tex "fe_controllersh" \
|
||||
--delete-tex "fe_controller" \
|
||||
\
|
||||
--include-tex assets/dc_ps2d.png dc_ps2d \
|
||||
--include-tex assets/dc_ps2f.png dc_ps2f \
|
||||
--include-tex assets/dc_xboxd.png dc_xboxd \
|
||||
--include-tex assets/dc_xboxf.png dc_xboxf \
|
||||
--include-tex assets/ps4_d.png ps4_d \
|
||||
--include-tex assets/ps4_f.png ps4_f \
|
||||
--include-tex assets/xbox_d.png xbox_d \
|
||||
--include-tex assets/xbox_f.png xbox_f
|
||||
|
||||
DEFAULT_RES = 512
|
||||
|
||||
PVR_ENCODER ?= PVRTEX
|
||||
|
||||
BIN
dreamcast/assets/dc_ps2d.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
dreamcast/assets/dc_ps2f.png
Normal file
|
After Width: | Height: | Size: 91 KiB |
BIN
dreamcast/assets/dc_xboxd.png
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
dreamcast/assets/dc_xboxf.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
dreamcast/assets/ps4_d.png
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
BIN
dreamcast/assets/ps4_f.png
Normal file
|
After Width: | Height: | Size: 77 KiB |
BIN
dreamcast/assets/xbox_d.png
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
BIN
dreamcast/assets/xbox_f.png
Normal file
|
After Width: | Height: | Size: 79 KiB |
@@ -3,6 +3,7 @@
|
||||
#include <cstring>
|
||||
|
||||
#include <set>
|
||||
#include <vector>
|
||||
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
@@ -238,6 +239,40 @@ PluginAttach(void)
|
||||
|
||||
const char* currentFile;
|
||||
|
||||
namespace rw {
|
||||
Image* readBMP(const char *filename);
|
||||
Image* readPNG(const char *filename);
|
||||
}
|
||||
|
||||
void InsertImage(RwTexDictionary* texDict, const char* file, const char* texName) {
|
||||
RwTexture *tex;
|
||||
RwRaster *raster;
|
||||
RwInt32 width, height, depth, format;
|
||||
RwImage *image = rw::readBMP(file);
|
||||
if (!image) {
|
||||
image = rw::readPNG(file);
|
||||
}
|
||||
|
||||
assert(image);
|
||||
|
||||
RwImageFindRasterFormat(image, rwRASTERTYPETEXTURE, &width, &height, &depth, &format);
|
||||
raster = RwRasterCreate(width, height, depth, format);
|
||||
RwRasterSetFromImage(raster, image);
|
||||
|
||||
tex = RwTextureCreate(raster);
|
||||
RwTextureSetName(tex, texName);
|
||||
|
||||
RwTextureSetFilterMode(tex, rwFILTERLINEAR);
|
||||
|
||||
RwTexDictionaryAddTexture(texDict, tex);
|
||||
|
||||
RwImageDestroy(image);
|
||||
}
|
||||
|
||||
std::vector<std::pair<const char*, const char*>> ImagesToAdd;
|
||||
std::vector<const char*> ImagesToRemove;
|
||||
bool listTextures = false;
|
||||
|
||||
int main(int argc, const char** argv) {
|
||||
if (argc >= 5) {
|
||||
int width = atoi(argv[3]);
|
||||
@@ -247,7 +282,7 @@ int main(int argc, const char** argv) {
|
||||
if(height >= 16 && height <= 1024)
|
||||
rw::dc::maxRasterHeight = height;
|
||||
}
|
||||
for (int i = 0; i < argc; i++) {
|
||||
for (int i = 5; i < argc; i++) {
|
||||
if (argv[i] != nullptr) {
|
||||
// Downsample Parameter
|
||||
if (strcmp(argv[i], "-d") == 0 || strcmp(argv[i], "-D") == 0) {
|
||||
@@ -271,6 +306,22 @@ int main(int argc, const char** argv) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (strcmp(argv[i], "--include-tex") == 0) {
|
||||
assert(i + 2 < argc);
|
||||
ImagesToAdd.emplace_back(argv[i+1], argv[i+2]);
|
||||
i += 2;
|
||||
}
|
||||
|
||||
if (strcmp(argv[i], "--delete-tex") == 0) {
|
||||
assert(i + 1 < argc);
|
||||
ImagesToRemove.emplace_back(argv[i+1]);
|
||||
i += 1;
|
||||
}
|
||||
|
||||
if (strcmp(argv[i], "--list-tex") == 0) {
|
||||
listTextures = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -298,6 +349,31 @@ int main(int argc, const char** argv) {
|
||||
|
||||
RwStreamClose(stream, nil);
|
||||
|
||||
if (listTextures) {
|
||||
fprintf(stdout, "Incoming textures:\n");
|
||||
FORLIST(lnk, texDict->textures) {
|
||||
auto tex = rw::Texture::fromDict(lnk);
|
||||
fprintf(stdout, "texture: '%s'\n", tex->name);
|
||||
}
|
||||
}
|
||||
|
||||
for (auto&& removedTextureName: ImagesToRemove) {
|
||||
auto removedTexture = texDict->find(removedTextureName);
|
||||
assert(removedTexture);
|
||||
texDict->remove(removedTexture);
|
||||
}
|
||||
for (auto&& extraTexture: ImagesToAdd) {
|
||||
InsertImage(texDict, extraTexture.first, extraTexture.second);
|
||||
}
|
||||
|
||||
if (listTextures) {
|
||||
fprintf(stdout, "Processing textures:\n");
|
||||
FORLIST(lnk, texDict->textures) {
|
||||
auto tex = rw::Texture::fromDict(lnk);
|
||||
fprintf(stdout, "texture: '%s'\n", tex->name);
|
||||
}
|
||||
}
|
||||
|
||||
auto streamOut = RwStreamOpen(rwSTREAMFILENAME, rwSTREAMWRITE, argv[2]);
|
||||
assert(streamOut && "failed to open output");
|
||||
|
||||
|
||||
@@ -140,7 +140,7 @@ CAnimBlendNode::GetCurrentTranslation(CVector &trans, float weight)
|
||||
float blend = association->GetBlendAmount(weight);
|
||||
if(blend > 0.0f){
|
||||
auto kfAdt = sequence->GetDeltaTime(frameA);
|
||||
float t = (kfAdt - remainingTime)/kfAdt;
|
||||
float t = kfAdt == 0.0f ? 0.0f : (kfAdt - remainingTime)/kfAdt;
|
||||
if(sequence->type & CAnimBlendSequence::KF_TRANS){
|
||||
auto kfAt = sequence->GetTranslation(frameA);
|
||||
auto kfBt = sequence->GetTranslation(frameB);
|
||||
|
||||
@@ -3789,6 +3789,10 @@ cAudioManager::ProcessPedOneShots(cPedParams ¶ms)
|
||||
if (iSound > 60)
|
||||
iSound = 21;
|
||||
}
|
||||
// In some cases the left and right channels have different loop points
|
||||
// This looks like a data file issue where the left and right channels have different loop points
|
||||
// This is a hot fix to always have the correct loop point for each channel individually
|
||||
SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex)
|
||||
AddSampleToRequestedQueue();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -174,6 +174,10 @@ public:
|
||||
|
||||
void UpdateEffectsVolume(void);
|
||||
|
||||
#ifdef DC_SH4
|
||||
void UpdateChannelVolume(uint32 nChannel);
|
||||
#endif
|
||||
|
||||
void SetEffectsMasterVolume(uint8 nVolume);
|
||||
void SetMusicMasterVolume (uint8 nVolume);
|
||||
void SetEffectsFadeVolume (uint8 nVolume);
|
||||
|
||||
@@ -151,7 +151,6 @@ void aica_snd_sfx_freq_vol(int chn, int freq, int vol) {
|
||||
|
||||
cSampleManager SampleManager;
|
||||
bool8 _bSampmanInitialised = FALSE;
|
||||
bool _dcAudioInitialized = false;
|
||||
|
||||
uint32 BankStartOffset[MAX_SFX_BANKS];
|
||||
char SampleBankDescFilename[] = "sfx/sfx_all.dsc";
|
||||
@@ -462,7 +461,7 @@ cSampleManager::Initialise(void)
|
||||
|
||||
assert(fdPedSfx >= 0);
|
||||
|
||||
_dcAudioInitialized = true;
|
||||
_bSampmanInitialised = true;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -485,7 +484,14 @@ char cSampleManager::GetCDAudioDriveLetter(void)
|
||||
void
|
||||
cSampleManager::UpdateEffectsVolume(void)
|
||||
{
|
||||
// TODO
|
||||
if(_bSampmanInitialised) {
|
||||
std::lock_guard<std::mutex> lk(channel_mtx);
|
||||
for (int i = 0; i < MAXCHANNELS+MAX2DCHANNELS; i++) {
|
||||
if (channels[i].ch != -1) {
|
||||
UpdateChannelVolume(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -851,9 +857,10 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void updateVol(uint32 nChannel) {
|
||||
void cSampleManager::UpdateChannelVolume(uint32 nChannel) {
|
||||
|
||||
auto newVol = channels[nChannel].emittingVol * channels[nChannel].attenuationVol / 255;
|
||||
newVol = m_nEffectsFadeVolume * newVol * m_nEffectsVolume >> 14;
|
||||
// newVol = 255;
|
||||
// printf("updateVol(nChannel: %d) vol: %d, newVol: %d\n", nChannel, channels[nChannel].vol, newVol);
|
||||
if (channels[nChannel].vol != newVol) {
|
||||
@@ -876,7 +883,7 @@ cSampleManager::SetChannelVolume(uint32 nChannel, uint32 nVolume)
|
||||
channels[nChannel].emittingVol = linearlize_volume(nVolume);// nVolume * 255 / MAX_VOLUME;
|
||||
channels[nChannel].attenuationVol = 255;
|
||||
|
||||
updateVol(nChannel);
|
||||
UpdateChannelVolume(nChannel);
|
||||
verbosef("SetChannelVolume(nChannel: %d) vol: %d\n", nChannel, nVolume);
|
||||
}
|
||||
|
||||
@@ -1132,7 +1139,8 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
|
||||
debugf("StartStreamedFile(%d, %d, %d)\n", nFile, nPos, nStream);
|
||||
uint32_t seek_aligned = 0;
|
||||
if (nPos) {
|
||||
uint32 seek_bytes = nPos * streams[nStream].rate / (streams[nStream].stereo ? 1000: 2000);
|
||||
uint64_t seek_bytes = (uint64_t)nPos * streams[nStream].rate / (streams[nStream].stereo ? 1000: 2000);
|
||||
assert(seek_bytes <= INT32_MAX);
|
||||
seek_aligned = seek_bytes & ~(streams[nStream].stereo ? (STREAM_STAGING_READ_SIZE_STEREO-1) : (STREAM_STAGING_READ_SIZE_MONO-1));
|
||||
}
|
||||
PreloadStreamedFile(nFile, nStream, seek_aligned);
|
||||
@@ -1164,7 +1172,9 @@ cSampleManager::GetStreamedFilePosition(uint8 nStream)
|
||||
ASSERT( nStream < MAX_STREAMS );
|
||||
int32 rv = 0;
|
||||
|
||||
return streams[nStream].played_samples * 1000 / streams[nStream].rate;
|
||||
int64_t rv64 = (int64_t)streams[nStream].played_samples * 1000 / streams[nStream].rate;
|
||||
assert(rv64 <= INT32_MAX);
|
||||
rv = (int32)rv64;
|
||||
// if(streams[nStream].fd >= 0) {
|
||||
// rv = fs_tell(streams[nStream].fd);
|
||||
// }
|
||||
@@ -1179,6 +1189,7 @@ cSampleManager::SetStreamedVolumeAndPan(uint8 nVolume, uint8 nPan, uint8 nEffect
|
||||
if (nVolume > MAX_VOLUME)
|
||||
nVolume = MAX_VOLUME;
|
||||
nVolume = linearlize_volume(nVolume); //nVolume * 255 / MAX_VOLUME;
|
||||
nVolume = m_nMusicFadeVolume * nVolume * m_nMusicVolume >> 14;
|
||||
if (streams[nStream].vol != nVolume || streams[nStream].nPan != nPan) {
|
||||
streams[nStream].vol = nVolume;
|
||||
streams[nStream].nPan = nPan;
|
||||
@@ -1207,7 +1218,10 @@ cSampleManager::GetStreamedFileLength(uint8 nFile)
|
||||
WavHeader hdr;
|
||||
assert(fs_read(fd, &hdr, sizeof(hdr)) == sizeof(hdr));
|
||||
|
||||
rv = hdr.dataSize * 2000 / hdr.numOfChan / hdr.samplesPerSec;
|
||||
uint64_t rv64 = (uint64_t)hdr.dataSize * 2000 / hdr.numOfChan / hdr.samplesPerSec;
|
||||
|
||||
assert(rv64 <= INT32_MAX);
|
||||
rv = (int32)rv64;
|
||||
|
||||
fs_close(fd);
|
||||
|
||||
@@ -1287,9 +1301,17 @@ void cSampleManager::SetChannelEmittingVolume(uint32 nChannel, uint32 nVolume)
|
||||
if (nVolume > MAX_VOLUME)
|
||||
nVolume = MAX_VOLUME;
|
||||
|
||||
// reduce channel volume when JB.MP3 or S4_BDBD.MP3 playing
|
||||
if ( MusicManager.GetMusicMode() == MUSICMODE_CUTSCENE
|
||||
&& MusicManager.GetNextTrack() != STREAMED_SOUND_NEWS_INTRO
|
||||
&& MusicManager.GetNextTrack() != STREAMED_SOUND_CUTSCENE_SAL4_BDBD )
|
||||
{
|
||||
nVolume /= 4;
|
||||
}
|
||||
|
||||
std::lock_guard<std::mutex> lk(channel_mtx);
|
||||
channels[nChannel].emittingVol = linearlize_volume(nVolume); // nVolume * 255 / MAX_VOLUME;
|
||||
updateVol(nChannel);
|
||||
UpdateChannelVolume(nChannel);
|
||||
}
|
||||
|
||||
float calculatePan(float x, float z) {
|
||||
@@ -1334,7 +1356,7 @@ void cSampleManager::SetChannel3DPosition (uint32 nChannel, float fX, float
|
||||
channels[nChannel].fY = fY;
|
||||
channels[nChannel].fZ = fZ;
|
||||
channels[nChannel].attenuationVol = calculateAttenuation(channels[nChannel].fX, channels[nChannel].fY, channels[nChannel].fZ, channels[nChannel].distMin, channels[nChannel].distMax) * 255;
|
||||
updateVol(nChannel);
|
||||
UpdateChannelVolume(nChannel);
|
||||
}
|
||||
|
||||
SetChannelPan(nChannel, calculatePan(-fX, fZ) * 63 + 64);
|
||||
@@ -1347,7 +1369,7 @@ void cSampleManager::SetChannel3DDistances (uint32 nChannel, float fMax, floa
|
||||
channels[nChannel].distMin = fMin;
|
||||
channels[nChannel].distMax = fMax;
|
||||
channels[nChannel].attenuationVol = calculateAttenuation(channels[nChannel].fX, channels[nChannel].fY, channels[nChannel].fZ, channels[nChannel].distMin, channels[nChannel].distMax) * 255;
|
||||
updateVol(nChannel);
|
||||
UpdateChannelVolume(nChannel);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1721,8 +1721,8 @@ int8 CRunningScript::ProcessCommands900To999(int32 command)
|
||||
return 0;
|
||||
int attempts;
|
||||
int model = -1;
|
||||
int index = CGeneral::GetRandomNumberInRange(0, 50);
|
||||
for (attempts = 0; attempts < 50; attempts++) {
|
||||
int index = CGeneral::GetRandomNumberInRange(0, MAXVEHICLESLOADED);
|
||||
for (attempts = 0; attempts < MAXVEHICLESLOADED; attempts++) {
|
||||
if (model != -1)
|
||||
break;
|
||||
model = CStreaming::ms_vehiclesLoaded[index];
|
||||
|
||||
@@ -1012,8 +1012,14 @@ void CGame::InitialiseWhenRestarting(void)
|
||||
DMAudio.ChangeMusicMode(MUSICMODE_GAME);
|
||||
}
|
||||
|
||||
namespace rw::dc {
|
||||
void relocate_objects();
|
||||
}
|
||||
|
||||
void CGame::Process(void)
|
||||
{
|
||||
rw::dc::relocate_objects();
|
||||
|
||||
CPad::UpdatePads();
|
||||
#ifdef USE_CUSTOM_ALLOCATOR
|
||||
ProcessTidyUpMemory();
|
||||
|
||||
@@ -2785,22 +2785,22 @@ bool CPad::WeaponJustDown(void)
|
||||
case 0: //Xbox Mode
|
||||
if (CPad::GetPad(0)->IsDualAnalog)
|
||||
{
|
||||
if (NewState.RightTrigger > 128)
|
||||
if (NewState.RightTrigger > 128 && !(OldState.RightTrigger > 128))
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (NewState.RightTrigger > 128)
|
||||
if (NewState.RightTrigger > 128 && !(OldState.RightTrigger > 128))
|
||||
return true;
|
||||
}
|
||||
case 1: //PS2 Mode
|
||||
if (CPad::GetPad(0)->IsDualAnalog)
|
||||
{
|
||||
return NewState.B;
|
||||
return NewState.B && !OldState.B;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NewState.B;
|
||||
return NewState.B && !OldState.B;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -83,6 +83,11 @@ CEntity::~CEntity(void)
|
||||
ResolveReferences();
|
||||
}
|
||||
|
||||
bool
|
||||
CEntity::IsFence(void) {
|
||||
return IsObject() && ::IsFence(static_cast<CObject *>(this)->GetModelIndex());
|
||||
}
|
||||
|
||||
void
|
||||
CEntity::SetModelIndex(uint32 id)
|
||||
{
|
||||
|
||||
@@ -131,6 +131,7 @@ public:
|
||||
bool IsPed(void) { return m_type == ENTITY_TYPE_PED; }
|
||||
bool IsObject(void) { return m_type == ENTITY_TYPE_OBJECT; }
|
||||
bool IsDummy(void) { return m_type == ENTITY_TYPE_DUMMY; }
|
||||
bool IsFence(void);
|
||||
|
||||
RpAtomic *GetAtomic(void) {
|
||||
assert(RwObjectGetType(m_rwObject) == rpATOMIC);
|
||||
|
||||
@@ -59,7 +59,7 @@ CPhysical::CPhysical(void)
|
||||
bInfiniteMass = false;
|
||||
bIsInWater = false;
|
||||
bHitByTrain = false;
|
||||
bSkipLineCol = false;
|
||||
bSkipLineCol = IsFence();
|
||||
|
||||
m_fDistanceTravelled = 0.0f;
|
||||
m_treadable[PATH_CAR] = nil;
|
||||
@@ -1461,6 +1461,10 @@ CPhysical::ProcessCollisionSectorList(CPtrList *lists)
|
||||
skipCollision = false;
|
||||
altcollision = false;
|
||||
|
||||
if(A->IsFence() && B->IsFence()) {
|
||||
skipCollision = true;
|
||||
A->bSkipLineCol = true;
|
||||
}
|
||||
if(B->IsBuilding())
|
||||
skipCollision = false;
|
||||
else if(IsStreetLight(A->GetModelIndex()) &&
|
||||
@@ -1922,12 +1926,12 @@ CPhysical::ProcessCollision(void)
|
||||
n = NUMSTEPS(0.09f);
|
||||
step = savedTimeStep / n;
|
||||
}
|
||||
}else if(responsecase == COLLRESPONSE_SMALLBOX || responsecase == COLLRESPONSE_FENCEPART){
|
||||
}else if(responsecase == COLLRESPONSE_SMALLBOX){
|
||||
if(distSq >= sq(0.15f)){
|
||||
n = NUMSTEPS(0.15f);
|
||||
step = savedTimeStep / n;
|
||||
}
|
||||
}else{
|
||||
}else if(responsecase != COLLRESPONSE_FENCEPART){
|
||||
if(distSq >= sq(0.3f)){
|
||||
n = NUMSTEPS(0.3f);
|
||||
step = savedTimeStep / n;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
# include <dc/sound/sound.h>
|
||||
# endif
|
||||
|
||||
extern bool _dcAudioInitialized;
|
||||
extern bool _bSampmanInitialised;
|
||||
|
||||
// ====== STATIC METHODS =====
|
||||
|
||||
@@ -86,7 +86,7 @@ void VmuProfiler::run() {
|
||||
|
||||
#ifdef DC_SH4
|
||||
if(auto *dev = maple_enum_type(0, MAPLE_FUNC_MEMCARD);
|
||||
dev && _dcAudioInitialized && updated_)
|
||||
dev && _bSampmanInitialised && updated_)
|
||||
{
|
||||
pvr_stats_t pvrStats; pvr_get_stats(&pvrStats);
|
||||
uint32_t sramStats = snd_mem_available();
|
||||
|
||||
48
vendor/librw/src/dc/rwdc.cpp
vendored
@@ -5,6 +5,10 @@
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
extern "C" size_t malloc_usable_size(void* m);
|
||||
|
||||
#include <list>
|
||||
|
||||
#if !defined(DC_TEXCONV) && !defined(MACOS64)
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
@@ -305,6 +309,8 @@ void rw_mat_load_4x4(rw::Matrix* mtx) {
|
||||
#define mat_identity(a)
|
||||
#define pvr_fog_table_color(a,r,g,b)
|
||||
#define pvr_fog_table_linear(s,e)
|
||||
#define pvr_fog_table_exp(d)
|
||||
#define pvr_fog_table_custom(d)
|
||||
#endif
|
||||
|
||||
#define mat_trans_single3_nomod(x_, y_, z_, x2, y2, z2) do { \
|
||||
@@ -663,7 +669,10 @@ void malloc_stats() { }
|
||||
#define UNIMPL_LOGV(...)
|
||||
#endif
|
||||
|
||||
Camera* rwdcCam;
|
||||
|
||||
void beginUpdate(Camera* cam) {
|
||||
rwdcCam = cam;
|
||||
float view[16], proj[16];
|
||||
|
||||
// View Matrix
|
||||
@@ -1098,6 +1107,7 @@ static bool doAlphaTest;
|
||||
|
||||
static uint8_t fogFuncPvr = PVR_FOG_DISABLE;
|
||||
static uint32_t fogColor = 0;
|
||||
static float fogStart = 0.0f;
|
||||
static uint32 cullModePvr;
|
||||
|
||||
static inline unsigned pvrCullMode(uint32_t cullMode) {
|
||||
@@ -1198,8 +1208,9 @@ setRenderState(int32 state, void *pvalue)
|
||||
fogFuncPvr = value ? PVR_FOG_TABLE : PVR_FOG_DISABLE;
|
||||
break;
|
||||
case FOGCOLOR:
|
||||
#if !defined(DC_TEXCONV)
|
||||
// Set fog color when state changes
|
||||
if(fogColor != value) {
|
||||
if(fogColor != value || fogStart != RwCameraGetFogDistance(rwdcCam)) {
|
||||
fogColor = value;
|
||||
RGBA c;
|
||||
c.red = value;
|
||||
@@ -1207,9 +1218,22 @@ setRenderState(int32 state, void *pvalue)
|
||||
c.blue = value>>16;
|
||||
c.alpha = value>>24;
|
||||
pvr_fog_table_color(c.alpha / 255.0f, c.red / 255.0f, c.green / 255.0f, c.blue / 255.0f);
|
||||
pvr_fog_table_linear(50.0f, 450.0f);
|
||||
|
||||
fogStart = RwCameraGetFogDistance(rwdcCam);
|
||||
float fogEnd = RwCameraGetFarClipPlane(rwdcCam);
|
||||
float fogIntensity[129];
|
||||
uint8_t idx = 0;
|
||||
float startIntensity = (-fogStart) / (fogEnd - fogStart); //interpolate between start and end to get initial intensity
|
||||
float step = (1.0f - startIntensity) / 129; // we have 129 entries, create a step such that start + (step*129) = 1.0
|
||||
for(int i = 128; i >= 0; i--) {
|
||||
fogIntensity[i] = startIntensity + (idx++ * step);
|
||||
}
|
||||
pvr_fog_far_depth(fogEnd);
|
||||
pvr_fog_table_custom(fogIntensity);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
||||
// case CULLMODE:
|
||||
// if(rwStateCache.cullmode != value){
|
||||
// rwStateCache.cullmode = value;
|
||||
@@ -4579,12 +4603,31 @@ writeNativeTexture(Texture *tex, Stream *stream)
|
||||
|
||||
#define DC_MODEL_VERSION 5
|
||||
|
||||
std::list<void**> allocations;
|
||||
|
||||
void relocate_objects() {
|
||||
for (auto allocation: allocations) {
|
||||
auto size = malloc_usable_size(*allocation);
|
||||
void* candidate = rwMalloc(size, MEMDUR_EVENT | ID_GEOMETRY);
|
||||
if (!candidate)
|
||||
continue;
|
||||
if ((uintptr_t&)candidate < (uintptr_t&)*allocation) {
|
||||
// fprintf(stderr, "Moving memory %p to %p\n", *allocation, candidate);
|
||||
memcpy(candidate, *allocation, size);
|
||||
free(*allocation);
|
||||
*allocation = candidate;
|
||||
} else {
|
||||
free(candidate);
|
||||
}
|
||||
}
|
||||
}
|
||||
void*
|
||||
destroyNativeData(void *object, int32, int32)
|
||||
{
|
||||
auto geo = (Geometry*)object;
|
||||
rwFree(geo->instData);
|
||||
geo->instData = nil;
|
||||
allocations.remove(&(void*&)geo->instData);
|
||||
|
||||
return object;
|
||||
}
|
||||
@@ -4602,6 +4645,7 @@ readNativeData(Stream *stream, int32 length, void *object, int32, int32)
|
||||
|
||||
DCModelDataHeader *header = (DCModelDataHeader *)rwNew(sizeof(DCModelDataHeader) + chunkLen - 8, MEMDUR_EVENT | ID_GEOMETRY);
|
||||
geo->instData = header;
|
||||
allocations.insert(allocations.begin(), &(void*&)geo->instData);
|
||||
stream->read32(&header->platform, 4);
|
||||
uint32_t version;
|
||||
stream->read32(&version, 4);
|
||||
|
||||