diff --git a/VCS PC/Audio.cpp b/VCS PC/Audio.cpp index 29f804b..6ad48b5 100644 --- a/VCS PC/Audio.cpp +++ b/VCS PC/Audio.cpp @@ -14,7 +14,6 @@ WRAPPER void CAudioEngine::SetEffectsMasterVolume(signed char nVolume) { WRAPARG WRAPPER void CAudioEngine::SetRadioAutoRetuneOnOff(bool bRetune) { WRAPARG(bRetune); EAXJMP(0x506F80); } WRAPPER void CAudioEngine::RetuneRadio(signed char nStation) { WRAPARG(nStation); EAXJMP(0x507E10); } WRAPPER const char* CAudioEngine::GetRadioStationName(signed char nStation) { WRAPARG(nStation); EAXJMP(0x507000); } -WRAPPER void CAudioEngine::ScrollRadioStations(signed char nDirection) { WRAPARG(nDirection); EAXJMP(0x573A00); } signed char CAERadioTrackManager::GetNextTrackByStation(BYTE stationID) diff --git a/VCS PC/Audio.h b/VCS PC/Audio.h index ccefa07..28ee737 100644 --- a/VCS PC/Audio.h +++ b/VCS PC/Audio.h @@ -88,7 +88,6 @@ class CAudioEngine void SetRadioAutoRetuneOnOff(bool bRetune); void RetuneRadio(signed char nStation); const char* GetRadioStationName(signed char nStation); - void ScrollRadioStations(signed char nDirection); }; extern CAudioEngine& AudioEngine; diff --git a/VCS PC/EmpireMgr.cpp b/VCS PC/EmpireMgr.cpp index 70495e4..ec96045 100644 --- a/VCS PC/EmpireMgr.cpp +++ b/VCS PC/EmpireMgr.cpp @@ -116,6 +116,7 @@ void CEmpireManager::Initialise() /*if ( pCurrentModelForDataParsing ) pCurrentModelForDataParsing->GetEmpireData()->ReduceContainerSize();*/ countMap.clear(); + assert(CModelInfo::GetModelInfo(pLine+2) != nullptr); pCurrentModelForDataParsing = CModelInfo::GetModelInfo(pLine+2)->AsAtomicModelInfoPtr(); pCurrentModelForDataParsing->InitEmpireData(); diff --git a/VCS PC/Frontend.cpp b/VCS PC/Frontend.cpp index ba7c44a..4494543 100644 --- a/VCS PC/Frontend.cpp +++ b/VCS PC/Frontend.cpp @@ -237,15 +237,15 @@ MenuItem CMenuManager::ms_pMenus[] = { // Graphics Setup { "FEH_GFX", 33, 3, - 61, "FEM_LOD", ACTION_CLICKORARROWS, 27, 0, -124, 2, 0, 0, - 24, "FEM_FRM", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, + 56, "FED_RES", ACTION_CLICKORARROWS, 27, 0, -154, 2, 0, 0, 26, "FED_WIS", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, + 24, "FEM_FRM", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, + MENUACTION_EFFECTS_QUALITY, "FED_EFF", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, MENUACTION_SHADOWS_QUALITY, "FED_SHA", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, + 61, "FEM_LOD", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, MENUACTION_SHADOWS_DISTANCE, "FED_SHD", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, - MENUACTION_TEXTURE_FILTERMODE, "FED_TXF", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, - MENUACTION_EFFECTS_QUALITY, "FED_EFF", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, 44, "FED_AAS", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, - 56, "FED_RES", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, + MENUACTION_TEXTURE_FILTERMODE, "FED_TXF", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, 5, "FET_DEF", ACTION_STANDARD, 50, 0, 141, 3, 0, 0, 2, "FEDS_TB", ACTION_STANDARD, 33, 0, 0, 3, 0, 0 }, @@ -402,7 +402,7 @@ MenuItem CMenuManager::ms_pMenus[] = { 2, "FEDS_TB", ACTION_STANDARD, 0, 0, 48, 3, 1, 0 }, // Restore defaults - Graphics Setup - { "FEH_GFX", 27, 8, + { "FEH_GFX", 27, 9, 1, "FED_RDP", ACTION_NONE, 0, 0, 0, 0, 0, 0, 5, "FEM_NO", ACTION_STANDARD, 27, 0, -9, 3, 0, 0, 57, "FEM_YES", ACTION_STANDARD, 27, 0, 16, 3, 0, 0 }, @@ -423,6 +423,7 @@ WRAPPER void CMenuManager::DisplayHelperText(const char* pText) { WRAPARG(pText) WRAPPER bool CMenuManager::CheckHover(int, int, int, int) { EAXJMP(0x57C4F0); } WRAPPER void CMenuManager::ProcessMissionPackNewGame() { EAXJMP(0x57D520); } WRAPPER void CMenuManager::DoSettingsBeforeStartingAGame() { EAXJMP(0x573330); } +WRAPPER void CMenuManager::ScrollRadioStations(signed char nDirection) { WRAPARG(nDirection); EAXJMP(0x573A00); } void CMenuManager::SaveSettings() { @@ -733,17 +734,16 @@ void CMenuManager::DrawStandardMenus(bool bDrawMenu) for ( unsigned int i = 0; i < NUM_ENTRIES_PER_MENU; i++ ) { CFont::SetFontStyle(FONT_Eurostile); + CFont::SetEdge(1); if ( aScreens[m_bCurrentMenuPage].entryList[i].specialDescFlag >= ACTION_SAVE_1 && aScreens[m_bCurrentMenuPage].entryList[i].specialDescFlag <= ACTION_SAVE_12 ) { // Save slot - CFont::SetScale(_width(0.42f), _height(0.95f)); - CFont::SetEdge(1); + CFont::SetScale(_width(0.42f), _height(0.95f)); } else { // Regular texts CFont::SetScale(_width(0.7f), _height(1.0f)); - CFont::SetEdge(1); } unsigned char nAlign; @@ -764,7 +764,7 @@ void CMenuManager::DrawStandardMenus(bool bDrawMenu) CFont::SetColor(CRGBA(MENU_ACTIVE_R, MENU_ACTIVE_G, MENU_ACTIVE_B)); else { - if ( CUpdateManager::NewUpdatesPending() && ((m_bCurrentMenuPage == 33 && i == 6) || (m_bCurrentMenuPage == 34 && i == 1) || (m_bCurrentMenuPage == 41 && i == 5) && (m_bCurrentMenuPage == 44 && i == 2)) ) + if ( CUpdateManager::NewUpdatesPending() && ((m_bCurrentMenuPage == 33 && i == 6) || (m_bCurrentMenuPage == 34 && i == 1) || (m_bCurrentMenuPage == 41 && i == 5) || (m_bCurrentMenuPage == 44 && i == 2)) ) CFont::SetColor(CRGBA(MENU_UPDATES_R, MENU_UPDATES_G, MENU_UPDATES_B)); else CFont::SetColor(CRGBA(MENU_INACTIVE_R, MENU_INACTIVE_G, MENU_INACTIVE_B)); @@ -1142,13 +1142,13 @@ void CMenuManager::DrawStandardMenus(bool bDrawMenu) case 61: { // Draw Distance - float nMouseInput = DisplaySlider(_xmiddle(MENU_TEXT_POSITION_RCOLUMN), _ymiddle(-124.0f + MENU_SLIDER_HEIGHT/2 - 1.25f), _height(MENU_SLIDER_HEIGHT), _width(100.0f), (m_fDrawDistance-0.925f) * (1.0f/0.875f), _width(MENU_SLIDER_WIDTH), false); + float nMouseInput = DisplaySlider(_xmiddle(MENU_TEXT_POSITION_RCOLUMN), _ymiddle(-4.0f + MENU_SLIDER_HEIGHT/2 - 1.25f), _height(MENU_SLIDER_HEIGHT), _width(100.0f), (m_fDrawDistance-0.925f) * (1.0f/0.875f), _width(MENU_SLIDER_WIDTH), false); if ( i == m_dwSelectedMenuItem ) { - if ( CheckHover(_xleft(95.0f), nMouseInput - _width(3.0f), _ymiddle(-124.0f + MENU_SLIDER_HEIGHT/2 - 1.25f), _ymiddle(-124.0f + 3*MENU_SLIDER_HEIGHT/2 + 1.25f)) ) + if ( CheckHover(_xleft(95.0f), nMouseInput - _width(3.0f), _ymiddle(-4.0f + MENU_SLIDER_HEIGHT/2 - 1.25f), _ymiddle(-4.0f + 3*MENU_SLIDER_HEIGHT/2 + 1.25f)) ) m_nHoverOption = 9; - else if ( CheckHover(nMouseInput + _width(3.0f), _x(95.0f), _ymiddle(-124.0f + MENU_SLIDER_HEIGHT/2 - 1.25f), _ymiddle(-124.0f + 3*MENU_SLIDER_HEIGHT/2 + 1.25f)) ) + else if ( CheckHover(nMouseInput + _width(3.0f), _x(95.0f), _ymiddle(-4.0f + MENU_SLIDER_HEIGHT/2 - 1.25f), _ymiddle(-4.0f + 3*MENU_SLIDER_HEIGHT/2 + 1.25f)) ) m_nHoverOption = 8; else m_nHoverOption = 16; @@ -1175,15 +1175,15 @@ void CMenuManager::DrawStandardMenus(bool bDrawMenu) { // Shadows Distance bool bLockedSlider = CShadows::GetShadowQuality() == SHADOW_QUALITY_OFF; - float nMouseInput = DisplaySlider(_xmiddle(MENU_TEXT_POSITION_RCOLUMN), _ymiddle(-4.0f + MENU_SLIDER_HEIGHT/2 - 1.25f), _height(MENU_SLIDER_HEIGHT), _width(100.0f), CShadows::GetShadowDistance(), _width(MENU_SLIDER_WIDTH), bLockedSlider); + float nMouseInput = DisplaySlider(_xmiddle(MENU_TEXT_POSITION_RCOLUMN), _ymiddle(26.0f + MENU_SLIDER_HEIGHT/2 - 1.25f), _height(MENU_SLIDER_HEIGHT), _width(100.0f), CShadows::GetShadowDistance(), _width(MENU_SLIDER_WIDTH), bLockedSlider); if ( !bLockedSlider ) { /*if ( i == m_dwSelectedMenuItem ) { - if ( CheckHover(_xleft(95.0f), nMouseInput - _width(3.0f), _ymiddle(-4.0f + MENU_SLIDER_HEIGHT/2 - 1.25f), _ymiddle(-4.0f + 3*MENU_SLIDER_HEIGHT/2 + 1.25f)) ) + if ( CheckHover(_xleft(95.0f), nMouseInput - _width(3.0f), _ymiddle(26.0f + MENU_SLIDER_HEIGHT/2 - 1.25f), _ymiddle(26.0f + 3*MENU_SLIDER_HEIGHT/2 + 1.25f)) ) m_nHoverOption = 15; - else if ( CheckHover(nMouseInput + _width(3.0f), _x(95.0f), _ymiddle(-4.0f + MENU_SLIDER_HEIGHT/2 - 1.25f), _ymiddle(-4.0f + 3*MENU_SLIDER_HEIGHT/2 + 1.25f)) ) + else if ( CheckHover(nMouseInput + _width(3.0f), _x(95.0f), _ymiddle(26.0f + MENU_SLIDER_HEIGHT/2 - 1.25f), _ymiddle(26.0f + 3*MENU_SLIDER_HEIGHT/2 + 1.25f)) ) m_nHoverOption = 14; else m_nHoverOption = 16; @@ -1349,7 +1349,7 @@ void CMenuManager::ProcessMenuOptions(signed char nArrowsInput, bool* bReturn, b return; case 32: - AudioEngine.ScrollRadioStations(nArrowsInput); + ScrollRadioStations(nArrowsInput); return; //case 36: - PS2 only case 34: diff --git a/VCS PC/Frontend.h b/VCS PC/Frontend.h index d4d1fc3..9b439ec 100644 --- a/VCS PC/Frontend.h +++ b/VCS PC/Frontend.h @@ -372,6 +372,7 @@ class CMenuManager private: void ProcessMissionPackNewGame(); void DoSettingsBeforeStartingAGame(); + void ScrollRadioStations(signed char nDirection); void PrintStats(); void PrintUpdaterScreen(); diff --git a/VCS PC/Ped.cpp b/VCS PC/Ped.cpp index c7e4437..55fd1f3 100644 --- a/VCS PC/Ped.cpp +++ b/VCS PC/Ped.cpp @@ -45,7 +45,7 @@ bool CPed::Load() void CPed::RenderForShadow(RpClump* pClump, bool bRenderWeapon) { - RpClumpForAllAtomics(pClump, ShadowCameraRenderCB, nullptr); + RpClumpForAllAtomics(pClump, ShadowCameraRenderCB, reinterpret_cast(TRUE)); if ( bRenderWeapon ) { diff --git a/VCS PC/RW.cpp b/VCS PC/RW.cpp index 377569b..57c3fae 100644 --- a/VCS PC/RW.cpp +++ b/VCS PC/RW.cpp @@ -43,6 +43,7 @@ WRAPPER RpLight* RpLightSetColor(RpLight* light, const RwRGBAReal* color) { WRAP WRAPPER RpClump* RpClumpRender(RpClump* clump) { WRAPARG(clump); EAXJMP(0x749B20); } WRAPPER RwMatrix* RwMatrixTranslate(RwMatrix* matrix, const RwV3d* translation, RwOpCombineType combineOp) { WRAPARG(matrix); WRAPARG(translation); WRAPARG(combineOp); EAXJMP(0x7F2450); } WRAPPER RwMatrix* RwMatrixRotate(RwMatrix* matrix, const RwV3d* axis, RwReal angle, RwOpCombineType combineOp) { WRAPARG(matrix); WRAPARG(axis); WRAPARG(angle); WRAPARG(combineOp); EAXJMP(0x7F1FD0); } +WRAPPER RwFrame* RwFrameRotate(RwFrame* frame, const RwV3d* axis, RwReal angle, RwOpCombineType combine) { WRAPARG(frame); WRAPARG(axis); WRAPARG(angle); WRAPARG(combine); EAXJMP(0x7F1010); } WRAPPER RwV3d* RwV3dTransformPoints(RwV3d* pointsOut, const RwV3d* pointsIn, RwInt32 numPoints, const RwMatrix* matrix) { WRAPARG(pointsOut); WRAPARG(pointsIn); WRAPARG(numPoints); WRAPARG(matrix); EAXJMP(0x7EDD90); } WRAPPER RwFrame* RwFrameUpdateObjects(RwFrame* frame) { WRAPARG(frame); EAXJMP(0x7F0910); } diff --git a/VCS PC/RealTimeShadowMgr.cpp b/VCS PC/RealTimeShadowMgr.cpp index 518f109..0f1dc4b 100644 --- a/VCS PC/RealTimeShadowMgr.cpp +++ b/VCS PC/RealTimeShadowMgr.cpp @@ -10,7 +10,7 @@ WRAPPER RwCamera* CShadowCamera::Create(int nSize) { WRAPARG(nSize); EAXJMP(0x705B60); } WRAPPER void CShadowCamera::Destroy() { EAXJMP(0x705400); } -WRAPPER void CShadowCamera::SetLight(RpLight* pLight) { WRAPARG(pLight); EAXJMP(0x705520); } +WRAPPER RwCamera* CShadowCamera::SetLight(RpLight* pLight) { WRAPARG(pLight); EAXJMP(0x705520); } WRAPPER void CShadowCamera::MakeGradientRaster() { EAXJMP(0x705D20); } WRAPPER RwCamera* CShadowCamera::SetCenter(RwV3d* pVector) { WRAPARG(pVector); EAXJMP(0x705590); } WRAPPER RwRaster* CShadowCamera::RasterResample(RwRaster* pRaster) { WRAPARG(pRaster); EAXJMP(0x706070); } @@ -42,7 +42,7 @@ RpAtomic* ShadowCameraRenderCB_Vehicle(RpAtomic* pAtomic, void* pData) RpAtomicGetPipeline(pAtomic, &pOldPipe); RpAtomicSetPipeline(pAtomic, RpAtomicGetDefaultPipeline()); - ShadowCameraRenderCB(pAtomic, pData); + ShadowCameraRenderCB(pAtomic, reinterpret_cast(TRUE)); RpAtomicSetPipeline(pAtomic, pOldPipe); @@ -58,8 +58,17 @@ RpAtomic* ShadowCameraRenderCB(RpAtomic* pAtomic, void* pData) RpGeometry* pGeometry = RpAtomicGetGeometry(pAtomic); RwUInt32 geometryFlags = RpGeometryGetFlags(pGeometry); - RpGeometrySetFlags(pGeometry, geometryFlags & ~(rpGEOMETRYTEXTURED|rpGEOMETRYPRELIT| + if ( reinterpret_cast(pData) ) + { + RpGeometrySetFlags(pGeometry, geometryFlags & ~(rpGEOMETRYTEXTURED|rpGEOMETRYPRELIT| + rpGEOMETRYLIGHT|rpGEOMETRYMODULATEMATERIALCOLOR|rpGEOMETRYTEXTURED2)); + } + else + { + // For CObject renders + RpGeometrySetFlags(pGeometry, geometryFlags & ~(rpGEOMETRYTEXTURED|/*rpGEOMETRYPRELIT|*/ rpGEOMETRYLIGHT|rpGEOMETRYMODULATEMATERIALCOLOR|rpGEOMETRYTEXTURED2)); + } AtomicDefaultRenderCallBack(pAtomic); RpGeometrySetFlags(pGeometry, geometryFlags); @@ -93,11 +102,15 @@ RwCamera* CShadowCamera::Update(RpAtomic* pAtomic, CEntity* pEntity) // Disable prelighting if it's not CObject if ( pEntity->nType != 4 ) + { RpGeometrySetFlags(pGeometry, geometryFlags & ~(rpGEOMETRYTEXTURED|rpGEOMETRYPRELIT| rpGEOMETRYLIGHT|rpGEOMETRYMODULATEMATERIALCOLOR|rpGEOMETRYTEXTURED2)); + } else + { RpGeometrySetFlags(pGeometry, geometryFlags & ~(rpGEOMETRYTEXTURED|/*rpGEOMETRYPRELIT|*/ rpGEOMETRYLIGHT|rpGEOMETRYMODULATEMATERIALCOLOR|rpGEOMETRYTEXTURED2)); + } AtomicDefaultRenderCallBack(pAtomic); @@ -129,6 +142,12 @@ RwCamera* CShadowCamera::Update(RpClump* pClump, CEntity* pEntity) static_cast(pEntity)->RenderForShadow(pClump, true); else if ( pEntity->nType == 2 ) static_cast(pEntity)->RenderForShadow(pClump); + else if ( pEntity->nType == 4 ) + RpClumpForAllAtomics(pClump, ShadowCameraRenderCB, FALSE); + else + { + assert(!"Baad, unknown entity type in CShadowCamera::Update!"); + } } InvertRaster(); @@ -137,6 +156,8 @@ RwCamera* CShadowCamera::Update(RpClump* pClump, CEntity* pEntity) return m_pCamera; } +#include "Coronas.h" + RwTexture* CRealTimeShadow::Update() { if ( m_pEntity->m_pRwObject ) @@ -160,6 +181,26 @@ RwTexture* CRealTimeShadow::Update() else if ( m_nRwObjectType == rpCLUMP ) m_Camera.Update(reinterpret_cast(m_pEntity->m_pRwObject), m_pEntity); + + /*CMatrix Helper(RwFrameGetMatrix(RwCameraGetFrame(m_Camera.m_pCamera))); + CVector vecPos = *Helper.GetPos(); + CVector vecRight = *Helper.GetPos() + *Helper.GetRight(); + CVector vecUp = *Helper.GetPos() + *Helper.GetUp(); + CVector vecAt = *Helper.GetPos() + *Helper.GetAt(); + + // pos + CCoronas::RegisterCorona((int)m_pEntity + 69, nullptr, 255, 255, 0, 255, vecPos, 0.25f, 1000.0f, gpCoronaTexture[1], 0, 0, 0, 0, 0.0f, false, 1.5f, false, 255, false, true); + + // right + CCoronas::RegisterCorona((int)m_pEntity + 69 + 1, nullptr, 255, 0, 0, 255, vecRight, 0.25f, 1000.0f, gpCoronaTexture[1], 0, 0, 0, 0, 0.0f, false, 1.5f, false, 255, false, true); + + // up + CCoronas::RegisterCorona((int)m_pEntity + 69 + 2, nullptr, 0, 255, 0, 255, vecUp, 0.25f, 1000.0f, gpCoronaTexture[1], 0, 0, 0, 0, 0.0f, false, 1.5f, false, 255, false, true); + + // at + CCoronas::RegisterCorona((int)m_pEntity + 69 + 3, nullptr, 0, 0, 255, 255, vecAt, 0.25f, 1000.0f, gpCoronaTexture[1], 0, 0, 0, 0, 0.0f, false, 1.5f, false, 255, false, true);*/ + + RwRaster* pRaster = RwCameraGetRaster(m_Camera.m_pCamera); if ( m_bDrawResample ) @@ -536,6 +577,29 @@ void CRealTimeShadowManager::ReInit() } } +void CRealTimeShadowManager::KeepBuildingShadowsAlive() +{ + if ( m_bInitialised && CShadows::GetShadowQuality() > SHADOW_QUALITY_MEDIUM ) + { + CVector vecCamCoords = *TheCamera.GetCoords(); + for ( int i = 0; i < NUM_MAX_REALTIME_SHADOWS; i++ ) + { + if ( !m_pShadows[i]->GetRenderedThisFrame() ) + { + CEntity* pShadowOwner = m_pShadows[i]->GetOwner(); + if ( pShadowOwner ) + { + if ( pShadowOwner->nType == 1 ) + { + if ( (*pShadowOwner->GetCoords() - vecCamCoords).MagnitudeSqr() < 45.0*45.0 ) + m_pShadows[i]->SetRenderedThisFrame(); + } + } + } + } + } +} + void CRealTimeShadowManager::ReturnRealTimeShadow(CRealTimeShadow* pShadow) { if ( m_bInitialised && pShadow->GetOwner() ) @@ -545,6 +609,11 @@ void CRealTimeShadowManager::ReturnRealTimeShadow(CRealTimeShadow* pShadow) } } +static void BuildingShadowsKeep() +{ + g_realTimeShadowMan.KeepBuildingShadowsAlive(); +} + static void __declspec(naked) ReturnShadowHack() { _asm @@ -566,6 +635,7 @@ static StaticPatcher Patcher([](){ Memory::InjectHook(0x706BA0, &CRealTimeShadowManager::DoShadowThisFrame, PATCH_JUMP); Memory::InjectHook(0x706AC2, &CRealTimeShadowManager::ReInit); Memory::InjectHook(0x706B29, &CRealTimeShadow::Update); + Memory::InjectHook(0x5539FC, BuildingShadowsKeep); // Increased shadows limit Memory::Patch(0x45D412, &g_realTimeShadowMan); diff --git a/VCS PC/RealTimeShadowMgr.h b/VCS PC/RealTimeShadowMgr.h index fb38665..0d7ca88 100644 --- a/VCS PC/RealTimeShadowMgr.h +++ b/VCS PC/RealTimeShadowMgr.h @@ -25,7 +25,7 @@ class CShadowCamera RwCamera* Create(int nSize); void Destroy(); - void SetLight(RpLight* pLight); + RwCamera* SetLight(RpLight* pLight); void MakeGradientRaster(); RwCamera* SetCenter(RwV3d* pVector); RwRaster* RasterResample(RwRaster* pRaster); @@ -56,8 +56,12 @@ class CRealTimeShadow RwSphere m_BaseSphere; public: + inline RwSphere* GetBaseSphere() + { return &m_BaseSphere; } inline class CEntity* GetOwner() { return m_pEntity; } + inline bool GetRenderedThisFrame() + { return m_bRenderedThisFrame; } inline void SetRenderedThisFrame() { m_bRenderedThisFrame = true; } inline void ResetIntensity() @@ -125,6 +129,8 @@ class CRealTimeShadowManager void DoShadowThisFrame(CEntity* pEntity); void GetRealTimeShadow(CEntity* pEntity); void ReInit(); + + void KeepBuildingShadowsAlive(); }; RpAtomic* ShadowCameraRenderCB(RpAtomic* pAtomic, void* pData); diff --git a/VCS PC/Shadows.cpp b/VCS PC/Shadows.cpp index 060b355..b6b1d5a 100644 --- a/VCS PC/Shadows.cpp +++ b/VCS PC/Shadows.cpp @@ -24,7 +24,7 @@ float MAX_DISTANCE_CAR_SHADOWS, MAX_DISTANCE_CAR_SHADOWS_SQR; // Vehicle // Min - 15.0 Max - 60.0 // Object -// Min - 12.5 Max - 45.0 +// Min - 15.0 Max - 60.0 void CShadows::RenderIndicatorShadow(unsigned int nIndex, unsigned char, RwTexture*, CVector* pPos, float radiusX, float, float, float radiusY, short) { @@ -43,7 +43,7 @@ void CShadows::InitialiseChangedSettings() // Recalculate distances MAX_DISTANCE_PED_SHADOWS = 12.5f + (m_fShadowDistMult*(45.0f-12.5f)); - MAX_DISTANCE_CAR_SHADOWS = 15.0 + (m_fShadowDistMult*(60.0f-15.0f)); + MAX_DISTANCE_CAR_SHADOWS = 15.0f + (m_fShadowDistMult*(60.0f-15.0f)); MAX_DISTANCE_PED_SHADOWS_SQR = MAX_DISTANCE_PED_SHADOWS*MAX_DISTANCE_PED_SHADOWS; MAX_DISTANCE_CAR_SHADOWS_SQR = MAX_DISTANCE_CAR_SHADOWS*MAX_DISTANCE_CAR_SHADOWS; @@ -98,14 +98,14 @@ void CShadows::SetRealTimeShadowDistances(CEntity* pEntity) { switch ( pEntity->nType ) { - case 2: - MAX_DISTANCE_REALTIME_SHADOWS = MAX_DISTANCE_CAR_SHADOWS; - MAX_DISTANCE_REALTIME_SHADOWS_SQR = MAX_DISTANCE_CAR_SHADOWS_SQR; - break; - default: + case 3: MAX_DISTANCE_REALTIME_SHADOWS = MAX_DISTANCE_PED_SHADOWS; MAX_DISTANCE_REALTIME_SHADOWS_SQR = MAX_DISTANCE_PED_SHADOWS_SQR; break; + default: + MAX_DISTANCE_REALTIME_SHADOWS = MAX_DISTANCE_CAR_SHADOWS; + MAX_DISTANCE_REALTIME_SHADOWS_SQR = MAX_DISTANCE_CAR_SHADOWS_SQR; + break; } } @@ -113,10 +113,10 @@ float CShadows::GetRealTimeShadowDistances(CEntity* pEntity) { switch ( pEntity->nType ) { - case 2: - return MAX_DISTANCE_CAR_SHADOWS; - default: + case 3: return MAX_DISTANCE_PED_SHADOWS; + default: + return MAX_DISTANCE_CAR_SHADOWS; } } @@ -285,9 +285,14 @@ void CShadows::Inject() Memory::Patch(0x70BEB6, &MAX_DISTANCE_CAR_SHADOWS); } +/*void MatrixTranslate(RwMatrix* matrix, CRealTimeShadow* pShadow) +{ + const RwV3d translation = { 0.5f, 0.5f, 0.0f }; + RwMatrixTranslate(matrix, &translation, rwCOMBINEPOSTCONCAT); +}*/ + static StaticPatcher Patcher([](){ -#ifdef NEW_SHADOWS_TEST2 // CRealTimeShadow for vehicle (temp) /*Memory::Patch(0x70BDA0, 0xC40350B9); Memory::Patch(0x70BDA4, 0x2474FF00); @@ -299,28 +304,41 @@ static StaticPatcher Patcher([](){ Memory::Patch(0x707F05, &f215); Memory::Patch(0x707F13, &f215); Memory::Patch(0x707F21, &f215); + + Memory::Patch(0x70A211, &f115); + Memory::Patch(0x70A228, &f115); - //Memory::Patch(0x70A211, &f115); - //Memory::Patch(0x70A228, &f115); - - Memory::InjectHook(0x707E4F, SetLightParameters); - Memory::InjectHook(0x70596A, RotateLightFrame); + //Memory::InjectHook(0x707E4F, SetLightParameters); + //Memory::InjectHook(0x70596A, RotateLightFrame); + Memory::Patch(0x705960, 0x3C2474FF); + Memory::Nop(0x70595F, 1); // Same as TranslateShdMatrix Memory::Patch(0x70A19D, 0.5f); // Same as SetupShadowBoundSphere - Memory::Patch(0x70A2AA, 9.75f); - Memory::Patch(0x707D59, 9.75f * 1.5f); + Memory::Patch(0x70A2AA, 23.5f); + Memory::Patch(0x707D59, 25.0f); //Memory::InjectHook(0x70A1AC, TranlateShdMatrix); Memory::InjectHook(0x707E2B, CompareSunZ, PATCH_JUMP); //Memory::InjectHook(0x70AD0D, CastShadow); //Memory::InjectHook(0x70A2C8, SetupShadowBoundSphere); + /*Memory::Patch(0x70A182, 0x3824B4FF); + Memory::Patch(0x70A186, 0x8D000002); + Memory::Patch(0x70A18C, 0xF8); + Memory::Patch(0x70A191, 0x19EB); + Memory::Patch(0x70A1B7, 0x224); + Memory::Patch(0x70A1BD, 0x1C); + Memory::InjectHook(0x70A1AC, MatrixTranslate);*/ // matrix rotate Memory::Nop(0x70A0C9, 5); + // Sun pos fix + Memory::Nop(0x707E29, 2); + Memory::Nop(0x707E3E, 2); + // Improved in car shadows //Memory::Patch(0x5E682C, 0x26EB); Memory::Patch(0x5E6813, 0xEB); @@ -329,7 +347,7 @@ static StaticPatcher Patcher([](){ Memory::InjectHook(0x59FEDB, StoreRTObjectShadowHack, PATCH_JUMP); Memory::InjectHook(0x707CAA, GetShadowHack, PATCH_JUMP); //Memory::InjectHook(0x70C753, StoreRTPoleShadowHack); -#endif + //Memory::InjectHook(0x705590, &CShadowCamera::SetCenter, PATCH_JUMP); CShadows::Inject(); diff --git a/VCS PC/StdAfx.h b/VCS PC/StdAfx.h index adcbb9a..b58c613 100644 --- a/VCS PC/StdAfx.h +++ b/VCS PC/StdAfx.h @@ -70,7 +70,6 @@ //#define MULTITHREADING_TEST //#define NEW_SHADOWS_TEST -#define NEW_SHADOWS_TEST2 //#define MAKE_ZZCOOL_MOVIE_DEMO @@ -145,7 +144,7 @@ void EnterAmazingScreenshotMode(bool bEnable); #include #include -#undef RXPIPELINEGLOBAL(var) +#undef RXPIPELINEGLOBAL #define RXPIPELINEGLOBAL(var) (RWPLUGINOFFSET(rwPipeGlobals, RwEngineInstance, *(RwInt32*)0xC9BC60)->var) #include "CCRC32.h" diff --git a/VCS PC/VCS PC.vcxproj b/VCS PC/VCS PC.vcxproj index 0597198..fcab020 100644 --- a/VCS PC/VCS PC.vcxproj +++ b/VCS PC/VCS PC.vcxproj @@ -365,6 +365,8 @@ popd true + true + true diff --git a/VCS PC/VCSPC.cpp b/VCS PC/VCSPC.cpp index 472e366..7092bed 100644 --- a/VCS PC/VCSPC.cpp +++ b/VCS PC/VCSPC.cpp @@ -199,9 +199,7 @@ void VideoPlayerPlayNextFrame(); void VideoPlayerProc(); void VideoPlayerRelease(); void MaxosFrameLimitHack(); -void FrameLimit_SwitchInject(); void FrameLimit_StringInject(); -void FrameLimit_SetFPS(); void FrameLimit_SetFPS2(); void CameraInitHack(); void OpaqueRadarHack(); @@ -312,7 +310,6 @@ void* ZeroScriptsCounter_JumpBack; void* func_01C6_JumpBack; void* RightShockKeyHack_JumpBack; void* NoRadioCommercialsHack_JumpBack; -void* VideoPlayerCreate1_JumpBack; void* VideoPlayerPlayNextFrame_JumpBack; void* VideoPlayerRelease_JumpBack; //void* FrameLimit_StringInject_JumpBack; @@ -870,8 +867,6 @@ __forceinline void DefineVariables() func_01C6_JumpBack = (void*)0x47D7EC; RightShockKeyHack_JumpBack = (void*)0x52FA42; NoRadioCommercialsHack_JumpBack = (void*)0x4EA675; - VideoPlayerCreate1_JumpBack = (void*)0x748B08; - VideoPlayerPlayNextFrame_JumpBack = (void*)0x748DA3; VideoPlayerRelease_JumpBack = (void*)0x748C21; //FrameLimit_StringInject_JumpBack = (void*)0x57A168; /*LoadFontsHack_JumpBack = (void*)0x5BA6E5; @@ -3111,9 +3106,8 @@ __forceinline void Main_Patches() Patch(0x6FB9A0, 0); // Relocated sun - // TODO: FIX COMPATIBILITY WITH MOBILE SHADOWS - //Patch(0x560A76, 1.0f); - //Nop(0x560A84, 6); + Patch(0x560A76, 1.0f); + Nop(0x560A84, 6); // More vehicles #if NUM_VEHICLE_MODELS > 212 @@ -6584,24 +6578,53 @@ void __declspec(naked) LoadRadios() void __declspec(naked) VideoPlayerCreate1() { - CVideoPlayer::Create("MOVIES\\LOGO.BIK"); - _asm jmp VideoPlayerCreate1_JumpBack + static const char filename[] = "MOVIES\\LOGO.BIK"; + _asm + { + push ebx + push edi + push ebx + push offset filename + call CVideoPlayer::Create + add esp, 10h + push 748B08h + retn + } } void __declspec(naked) VideoPlayerCreate2() { - CVideoPlayer::Release(); - CVideoPlayer::Create("MOVIES\\GTATITLES.BIK"); - *gameState = 4; - _asm jmp VideoPlayerPlayNextFrame_JumpBack + static const char filename[] = "MOVIES\\GTATITLES.BIK"; + _asm + { + call CVideoPlayer::Release + push ebx + push edi + push ebx + push offset filename + call CVideoPlayer::Create + add esp, 10h + mov eax, [gameState] + mov [eax], 4 + push 748DA3h + retn + } } void __declspec(naked) VideoPlayerPlayNextFrame() { - if ( !CVideoPlayer::PlayNextFullscreenFrame() ) - ++(*gameState); + _asm + { + call CVideoPlayer::PlayNextFullscreenFrame + test al, al + jnz VideoPlayerPlayNextFrame_Return + mov eax, [gameState] + inc [eax] - _asm jmp VideoPlayerPlayNextFrame_JumpBack +VideoPlayerPlayNextFrame_Return: + push 748DA3h + retn + } } void __declspec(naked) VideoPlayerProc() @@ -6644,6 +6667,7 @@ void __declspec(naked) MaxosFrameLimitHack() _asm { + pushad test al, al jz MaxosFrameLimitHack_NoLimit mov eax, [RsGlobal] @@ -6656,7 +6680,7 @@ void __declspec(naked) MaxosFrameLimitHack() mov fOne, 41000000h MaxosFrameLimitHack_LimitFrames: - mov eax, [esp+14h] + mov eax, [esp+20h+14h] mov fTwo, eax } @@ -6677,71 +6701,12 @@ void __declspec(naked) MaxosFrameLimitHack() _asm { + popad mov eax, 748DA3h jmp eax } } -void __declspec(naked) FrameLimit_SwitchInject() -{ - _asm - { - mov dl, [esp+0Ch+4] - cmp dl, 0 - jl FrameLimit_SwitchInject_Previous - cmp al, 4 - jnl FrameLimit_SwitchInject_ZeroTheValue - inc al - jmp FrameLimit_SwitchInject_GoBack - -FrameLimit_SwitchInject_ZeroTheValue: - xor al, al - jmp FrameLimit_SwitchInject_GoBack - -FrameLimit_SwitchInject_Previous: - test al, al - jz FrameLimit_SwitchInject_ToMax - dec al - jmp FrameLimit_SwitchInject_GoBack - -FrameLimit_SwitchInject_ToMax: - mov al, 4 - -FrameLimit_SwitchInject_GoBack: - movzx ecx, al - mov ecx, RsGlobalFrameLimits[ecx*4] - mov ebx, [RsGlobal] - mov [ebx].frameLimit, ecx - mov ecx, esi - mov [esi].m_bFrameLimiterMode, al - call CMenuManager::SaveSettings - pop edi - pop esi - mov al, bl - pop ebx - retn 8 - } -} - -void __declspec(naked) FrameLimit_SetFPS() -{ - _asm - { - movzx eax, byte ptr [edi].m_bFrameLimiterMode - test eax, eax - jz FrameLimit_SetFPS_Return - mov ecx, RsGlobalFrameLimits[eax*4] - mov eax, [RsGlobal] - mov [eax].frameLimit, ecx - -FrameLimit_SetFPS_Return: - pop edi - pop esi - add esp, 44h - retn - } -} - void __declspec(naked) CameraInitHack() { _asm diff --git a/VCS PC/X360Pad.cpp b/VCS PC/X360Pad.cpp index 83ecb91..bfaadaa 100644 --- a/VCS PC/X360Pad.cpp +++ b/VCS PC/X360Pad.cpp @@ -119,6 +119,6 @@ void CX360Pad::Vibrate(unsigned short wLeftMotorSpeed, unsigned short wRightMoto if ( !hXinputLibrary ) InitializeLibrary(); - XInputSetState(dwPadIndex, &vibrationData); + //XInputSetState(dwPadIndex, &vibrationData); } } \ No newline at end of file