finished CMotionBlurStreaks, CSpecialFX

This commit is contained in:
aap 2020-04-07 22:26:01 +02:00
parent 51512db006
commit daaf443cfa
6 changed files with 294 additions and 45 deletions

View File

@ -43,7 +43,6 @@ CBoat
CBulletInfo CBulletInfo
CExplosion CExplosion
CMenuManager - WIP CMenuManager - WIP
CMotionBlurStreaks
CObject CObject
CPacManPickups CPacManPickups
CPad - only cheats CPad - only cheats
@ -53,7 +52,6 @@ CRecordDataForChase
CRecordDataForGame CRecordDataForGame
CRoadBlocks CRoadBlocks
CSkidmarks CSkidmarks
CSpecialFX
CStats CStats
CTrafficLights CTrafficLights
CWeapon CWeapon

View File

@ -78,6 +78,7 @@ enum Config {
NUMMONEYMESSAGES = 16, NUMMONEYMESSAGES = 16,
NUMPICKUPMESSAGES = 16, NUMPICKUPMESSAGES = 16,
NUMBULLETTRACES = 16, NUMBULLETTRACES = 16,
NUMMBLURSTREAKS = 4,
NUMONSCREENTIMERENTRIES = 1, NUMONSCREENTIMERENTRIES = 1,
NUMRADARBLIPS = 32, NUMRADARBLIPS = 32,

View File

@ -162,17 +162,17 @@ Idle(void *arg)
} else { } else {
CPointLights::InitPerFrame(); CPointLights::InitPerFrame();
#ifdef TIMEBARS #ifdef TIMEBARS
tbStartTimer(0, "CGame::Process"); tbStartTimer(0, "CGame::Process");
#endif #endif
CGame::Process(); CGame::Process();
#ifdef TIMEBARS #ifdef TIMEBARS
tbEndTimer("CGame::Process"); tbEndTimer("CGame::Process");
tbStartTimer(0, "DMAudio.Service"); tbStartTimer(0, "DMAudio.Service");
#endif #endif
DMAudio.Service(); DMAudio.Service();
#ifdef TIMEBARS #ifdef TIMEBARS
tbEndTimer("DMAudio.Service"); tbEndTimer("DMAudio.Service");
#endif #endif
} }
@ -181,18 +181,18 @@ Idle(void *arg)
#else #else
CPointLights::InitPerFrame(); CPointLights::InitPerFrame();
#ifdef TIMEBARS #ifdef TIMEBARS
tbStartTimer(0, "CGame::Process"); tbStartTimer(0, "CGame::Process");
#endif #endif
CGame::Process(); CGame::Process();
#ifdef TIMEBARS #ifdef TIMEBARS
tbEndTimer("CGame::Process"); tbEndTimer("CGame::Process");
tbStartTimer(0, "DMAudio.Service"); tbStartTimer(0, "DMAudio.Service");
#endif #endif
DMAudio.Service(); DMAudio.Service();
#ifdef TIMEBARS #ifdef TIMEBARS
tbEndTimer("DMAudio.Service"); tbEndTimer("DMAudio.Service");
#endif #endif
#endif #endif
@ -222,16 +222,16 @@ Idle(void *arg)
} }
#endif #endif
#ifdef TIMEBARS #ifdef TIMEBARS
tbStartTimer(0, "CnstrRenderList"); tbStartTimer(0, "CnstrRenderList");
#endif #endif
CRenderer::ConstructRenderList(); CRenderer::ConstructRenderList();
#ifdef TIMEBARS #ifdef TIMEBARS
tbEndTimer("CnstrRenderList"); tbEndTimer("CnstrRenderList");
tbStartTimer(0, "PreRender"); tbStartTimer(0, "PreRender");
#endif #endif
CRenderer::PreRender(); CRenderer::PreRender();
#ifdef TIMEBARS #ifdef TIMEBARS
tbEndTimer("PreRender"); tbEndTimer("PreRender");
#endif #endif
if(CWeather::LightningFlash && !CCullZones::CamNoRain()){ if(CWeather::LightningFlash && !CCullZones::CamNoRain()){
@ -251,17 +251,17 @@ Idle(void *arg)
RwCameraSetFogDistance(Scene.camera, CTimeCycle::GetFogStart()); RwCameraSetFogDistance(Scene.camera, CTimeCycle::GetFogStart());
#ifdef TIMEBARS #ifdef TIMEBARS
tbStartTimer(0, "RenderScene"); tbStartTimer(0, "RenderScene");
#endif #endif
RenderScene(); RenderScene();
#ifdef TIMEBARS #ifdef TIMEBARS
tbEndTimer("RenderScene"); tbEndTimer("RenderScene");
#endif #endif
RenderDebugShit(); RenderDebugShit();
RenderEffects(); RenderEffects();
#ifdef TIMEBARS #ifdef TIMEBARS
tbStartTimer(0, "RenderMotionBlur"); tbStartTimer(0, "RenderMotionBlur");
#endif #endif
if((TheCamera.m_BlurType == MBLUR_NONE || TheCamera.m_BlurType == MBLUR_NORMAL) && if((TheCamera.m_BlurType == MBLUR_NONE || TheCamera.m_BlurType == MBLUR_NORMAL) &&
TheCamera.m_ScreenReductionPercentage > 0.0f) TheCamera.m_ScreenReductionPercentage > 0.0f)
@ -269,11 +269,11 @@ Idle(void *arg)
TheCamera.RenderMotionBlur(); TheCamera.RenderMotionBlur();
#ifdef TIMEBARS #ifdef TIMEBARS
tbEndTimer("RenderMotionBlur"); tbEndTimer("RenderMotionBlur");
tbStartTimer(0, "Render2dStuff"); tbStartTimer(0, "Render2dStuff");
#endif #endif
Render2dStuff(); Render2dStuff();
#ifdef TIMEBARS #ifdef TIMEBARS
tbEndTimer("Render2dStuff"); tbEndTimer("Render2dStuff");
#endif #endif
}else{ }else{
float viewWindow = DEFAULT_VIEWWINDOW; float viewWindow = DEFAULT_VIEWWINDOW;
@ -293,21 +293,21 @@ Idle(void *arg)
DefinedState(); DefinedState();
#endif #endif
#ifdef TIMEBARS #ifdef TIMEBARS
tbStartTimer(0, "RenderMenus"); tbStartTimer(0, "RenderMenus");
#endif #endif
RenderMenus(); RenderMenus();
#ifdef TIMEBARS #ifdef TIMEBARS
tbEndTimer("RenderMenus"); tbEndTimer("RenderMenus");
tbStartTimer(0, "DoFade"); tbStartTimer(0, "DoFade");
#endif #endif
DoFade(); DoFade();
#ifdef TIMEBARS #ifdef TIMEBARS
tbEndTimer("DoFade"); tbEndTimer("DoFade");
tbStartTimer(0, "Render2dStuff-Fade"); tbStartTimer(0, "Render2dStuff-Fade");
#endif #endif
Render2dStuffAfterFade(); Render2dStuffAfterFade();
#ifdef TIMEBARS #ifdef TIMEBARS
tbEndTimer("Render2dStuff-Fade"); tbEndTimer("Render2dStuff-Fade");
#endif #endif
CCredits::Render(); CCredits::Render();

View File

@ -394,13 +394,13 @@ CEntity::PreRender(void)
}else if(GetModelIndex() == MI_GRENADE){ }else if(GetModelIndex() == MI_GRENADE){
CMotionBlurStreaks::RegisterStreak((uintptr)this, CMotionBlurStreaks::RegisterStreak((uintptr)this,
100, 100, 100, 100, 100, 100,
TheCamera.GetPosition() - 0.07f*TheCamera.GetRight(), GetPosition() - 0.07f*TheCamera.GetRight(),
TheCamera.GetPosition() + 0.07f*TheCamera.GetRight()); GetPosition() + 0.07f*TheCamera.GetRight());
}else if(GetModelIndex() == MI_MOLOTOV){ }else if(GetModelIndex() == MI_MOLOTOV){
CMotionBlurStreaks::RegisterStreak((uintptr)this, CMotionBlurStreaks::RegisterStreak((uintptr)this,
0, 100, 0, 0, 100, 0,
TheCamera.GetPosition() - 0.07f*TheCamera.GetRight(), GetPosition() - 0.07f*TheCamera.GetRight(),
TheCamera.GetPosition() + 0.07f*TheCamera.GetRight()); GetPosition() + 0.07f*TheCamera.GetRight());
} }
}else if(GetModelIndex() == MI_MISSILE){ }else if(GetModelIndex() == MI_MISSILE){
CVector pos = GetPosition(); CVector pos = GetPosition();

View File

@ -9,9 +9,12 @@
#include "TxdStore.h" #include "TxdStore.h"
#include "FileMgr.h" #include "FileMgr.h"
#include "FileLoader.h" #include "FileLoader.h"
#include "Timecycle.h"
#include "Lights.h" #include "Lights.h"
#include "ModelIndices.h"
#include "VisibilityPlugins.h" #include "VisibilityPlugins.h"
#include "World.h" #include "World.h"
#include "PlayerPed.h"
#include "Particle.h" #include "Particle.h"
#include "Shadows.h" #include "Shadows.h"
#include "General.h" #include "General.h"
@ -19,17 +22,247 @@
#include "Shadows.h" #include "Shadows.h"
#include "main.h" #include "main.h"
WRAPPER void CSpecialFX::Render(void) { EAXJMP(0x518DC0); } RxObjSpace3DVertex StreakVertices[4];
WRAPPER void CSpecialFX::Update(void) { EAXJMP(0x518D40); } RwImVertexIndex StreakIndexList[12];
WRAPPER void CSpecialFX::Init(void) { EAXJMP(0x5189E0); }
WRAPPER void CSpecialFX::Shutdown(void) { EAXJMP(0x518BE0); }
WRAPPER void CMotionBlurStreaks::RegisterStreak(int32 id, uint8 r, uint8 g, uint8 b, CVector p1, CVector p2) { EAXJMP(0x519460); } RxObjSpace3DVertex TraceVertices[6];
RwImVertexIndex TraceIndexList[12];
CBulletTrace (&CBulletTraces::aTraces)[NUMBULLETTRACES] = *(CBulletTrace(*)[NUMBULLETTRACES])*(uintptr*)0x72B1B8; void
RxObjSpace3DVertex (&TraceVertices)[6] = *(RxObjSpace3DVertex(*)[6])*(uintptr*)0x649884; CSpecialFX::Init(void)
RwImVertexIndex (&TraceIndexList)[12] = *(RwImVertexIndex(*)[12])*(uintptr*)0x64986C; {
CBulletTraces::Init();
RwIm3DVertexSetU(&StreakVertices[0], 0.0f);
RwIm3DVertexSetV(&StreakVertices[0], 0.0f);
RwIm3DVertexSetU(&StreakVertices[1], 1.0f);
RwIm3DVertexSetV(&StreakVertices[1], 0.0f);
RwIm3DVertexSetU(&StreakVertices[2], 0.0f);
RwIm3DVertexSetV(&StreakVertices[2], 0.0f);
RwIm3DVertexSetU(&StreakVertices[3], 1.0f);
RwIm3DVertexSetV(&StreakVertices[3], 0.0f);
StreakIndexList[0] = 0;
StreakIndexList[1] = 1;
StreakIndexList[2] = 2;
StreakIndexList[3] = 1;
StreakIndexList[4] = 3;
StreakIndexList[5] = 2;
StreakIndexList[6] = 0;
StreakIndexList[7] = 2;
StreakIndexList[8] = 1;
StreakIndexList[9] = 1;
StreakIndexList[10] = 2;
StreakIndexList[11] = 3;
RwIm3DVertexSetRGBA(&TraceVertices[0], 20, 20, 20, 255);
RwIm3DVertexSetRGBA(&TraceVertices[1], 20, 20, 20, 255);
RwIm3DVertexSetRGBA(&TraceVertices[2], 70, 70, 70, 255);
RwIm3DVertexSetRGBA(&TraceVertices[3], 70, 70, 70, 255);
RwIm3DVertexSetRGBA(&TraceVertices[4], 10, 10, 10, 255);
RwIm3DVertexSetRGBA(&TraceVertices[5], 10, 10, 10, 255);
RwIm3DVertexSetU(&TraceVertices[0], 0.0);
RwIm3DVertexSetV(&TraceVertices[0], 0.0);
RwIm3DVertexSetU(&TraceVertices[1], 1.0);
RwIm3DVertexSetV(&TraceVertices[1], 0.0);
RwIm3DVertexSetU(&TraceVertices[2], 0.0);
RwIm3DVertexSetV(&TraceVertices[2], 0.5);
RwIm3DVertexSetU(&TraceVertices[3], 1.0);
RwIm3DVertexSetV(&TraceVertices[3], 0.5);
RwIm3DVertexSetU(&TraceVertices[4], 0.0);
RwIm3DVertexSetV(&TraceVertices[4], 1.0);
RwIm3DVertexSetU(&TraceVertices[5], 1.0);
RwIm3DVertexSetV(&TraceVertices[5], 1.0);
TraceIndexList[0] = 0;
TraceIndexList[1] = 2;
TraceIndexList[2] = 1;
TraceIndexList[3] = 1;
TraceIndexList[4] = 2;
TraceIndexList[5] = 3;
TraceIndexList[6] = 2;
TraceIndexList[7] = 4;
TraceIndexList[8] = 3;
TraceIndexList[9] = 3;
TraceIndexList[10] = 4;
TraceIndexList[11] = 5;
CMotionBlurStreaks::Init();
CBrightLights::Init();
CShinyTexts::Init();
CMoneyMessages::Init();
C3dMarkers::Init();
}
RwObject*
LookForBatCB(RwObject *object, void *data)
{
static CMatrix MatLTM;
if(CVisibilityPlugins::GetAtomicModelInfo((RpAtomic*)object) == (CSimpleModelInfo*)data){
MatLTM = CMatrix(RwFrameGetLTM(RpAtomicGetFrame((RpAtomic*)object)));
CVector p1 = MatLTM * CVector(0.02f, 0.05f, 0.07f);
CVector p2 = MatLTM * CVector(0.246f, 0.0325f, 0.796f);
CMotionBlurStreaks::RegisterStreak((uintptr)object, 100, 100, 100, p1, p2);
}
return nil;
}
void
CSpecialFX::Update(void)
{
CMotionBlurStreaks::Update();
CBulletTraces::Update();
if(FindPlayerPed() &&
FindPlayerPed()->GetWeapon()->m_eWeaponType == WEAPONTYPE_BASEBALLBAT &&
FindPlayerPed()->GetWeapon()->m_eWeaponState == WEAPONSTATE_FIRING)
RwFrameForAllObjects(FindPlayerPed()->GetNodeFrame(PED_HANDR), LookForBatCB, CModelInfo::GetModelInfo(MI_BASEBALL_BAT));
}
void
CSpecialFX::Shutdown(void)
{
C3dMarkers::Shutdown();
}
void
CSpecialFX::Render(void)
{
CMotionBlurStreaks::Render();
CBulletTraces::Render();
CBrightLights::Render();
CShinyTexts::Render();
CMoneyMessages::Render();
C3dMarkers::Render();
}
CRegisteredMotionBlurStreak CMotionBlurStreaks::aStreaks[NUMMBLURSTREAKS];
void
CRegisteredMotionBlurStreak::Update(void)
{
int i;
bool wasUpdated;
bool lastWasUpdated = false;
for(i = 2; i > 0; i--){
m_pos1[i] = m_pos1[i-1];
m_pos2[i] = m_pos2[i-1];
m_isValid[i] = m_isValid[i-1];
wasUpdated = true;
if(!lastWasUpdated && !m_isValid[i])
wasUpdated = false;
lastWasUpdated = wasUpdated;
}
m_isValid[0] = false;
if(!wasUpdated)
m_id = 0;
}
void
CRegisteredMotionBlurStreak::Render(void)
{
int i;
int a1, a2;
for(i = 0; i < 2; i++)
if(m_isValid[i] && m_isValid[i+1]){
a1 = (255/3)*(3-i)/3;
RwIm3DVertexSetRGBA(&StreakVertices[0], m_red, m_green, m_blue, a1);
RwIm3DVertexSetRGBA(&StreakVertices[1], m_red, m_green, m_blue, a1);
a2 = (255/3)*(3-(i+1))/3;
RwIm3DVertexSetRGBA(&StreakVertices[2], m_red, m_green, m_blue, a2);
RwIm3DVertexSetRGBA(&StreakVertices[3], m_red, m_green, m_blue, a2);
RwIm3DVertexSetPos(&StreakVertices[0], m_pos1[i].x, m_pos1[i].y, m_pos1[i].z);
RwIm3DVertexSetPos(&StreakVertices[1], m_pos2[i].x, m_pos2[i].y, m_pos2[i].z);
RwIm3DVertexSetPos(&StreakVertices[2], m_pos1[i+1].x, m_pos1[i+1].y, m_pos1[i+1].z);
RwIm3DVertexSetPos(&StreakVertices[3], m_pos2[i+1].x, m_pos2[i+1].y, m_pos2[i+1].z);
LittleTest();
if(RwIm3DTransform(StreakVertices, 4, nil, rwIM3D_VERTEXUV)){
RwIm3DRenderIndexedPrimitive(rwPRIMTYPETRILIST, StreakIndexList, 12);
RwIm3DEnd();
}
}
}
void
CMotionBlurStreaks::Init(void)
{
int i;
for(i = 0; i < NUMMBLURSTREAKS; i++)
aStreaks[i].m_id = 0;
}
void
CMotionBlurStreaks::Update(void)
{
int i;
for(i = 0; i < NUMMBLURSTREAKS; i++)
if(aStreaks[i].m_id)
aStreaks[i].Update();
}
void
CMotionBlurStreaks::RegisterStreak(uintptr id, uint8 r, uint8 g, uint8 b, CVector p1, CVector p2)
{
int i;
for(i = 0; i < NUMMBLURSTREAKS; i++){
if(aStreaks[i].m_id == id){
// Found a streak from last frame, update
aStreaks[i].m_red = r;
aStreaks[i].m_green = g;
aStreaks[i].m_blue = b;
aStreaks[i].m_pos1[0] = p1;
aStreaks[i].m_pos2[0] = p2;
aStreaks[i].m_isValid[0] = true;
return;
}
}
// Find free slot
for(i = 0; aStreaks[i].m_id; i++)
if(i == NUMMBLURSTREAKS-1)
return;
// Create a new streak
aStreaks[i].m_id = id;
aStreaks[i].m_red = r;
aStreaks[i].m_green = g;
aStreaks[i].m_blue = b;
aStreaks[i].m_pos1[0] = p1;
aStreaks[i].m_pos2[0] = p2;
aStreaks[i].m_isValid[0] = true;
aStreaks[i].m_isValid[1] = false;
aStreaks[i].m_isValid[2] = false;
}
void
CMotionBlurStreaks::Render(void)
{
bool setRenderStates = false;
int i;
for(i = 0; i < NUMMBLURSTREAKS; i++)
if(aStreaks[i].m_id){
if(!setRenderStates){
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void *)TRUE);
RwRenderStateSet(rwRENDERSTATEFOGCOLOR,
(void*)RWRGBALONG(CTimeCycle::GetFogRed(), CTimeCycle::GetFogGreen(), CTimeCycle::GetFogBlue(), 255));
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void*)FALSE);
setRenderStates = true;
}
aStreaks[i].Render();
}
if(setRenderStates){
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE);
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void *)FALSE);
}
}
CBulletTrace CBulletTraces::aTraces[NUMBULLETTRACES];
void CBulletTraces::Init(void) void CBulletTraces::Init(void)
{ {
@ -201,9 +434,9 @@ C3dMarker::Render()
ReSetAmbientAndDirectionalColours(); ReSetAmbientAndDirectionalColours();
} }
C3dMarker(&C3dMarkers::m_aMarkerArray)[NUM3DMARKERS] = *(C3dMarker(*)[NUM3DMARKERS])*(uintptr*)0x72D408; C3dMarker C3dMarkers::m_aMarkerArray[NUM3DMARKERS];
int32 &C3dMarkers::NumActiveMarkers = *(int32*)0x8F2A08; int32 C3dMarkers::NumActiveMarkers;
RpClump* (&C3dMarkers::m_pRpClumpArray)[NUMMARKERTYPES] = *(RpClump*(*)[NUMMARKERTYPES])*(uintptr*)0x8E2888; RpClump* C3dMarkers::m_pRpClumpArray[NUMMARKERTYPES];
void void
C3dMarkers::Init() C3dMarkers::Init()
@ -627,9 +860,7 @@ CBrightLights::RenderOutGeometryBuffer(void)
TempBufferVerticesStored = 0; TempBufferVerticesStored = 0;
TempBufferIndicesStored = 0; TempBufferIndicesStored = 0;
} }
} }
int CShinyTexts::NumShinyTexts; int CShinyTexts::NumShinyTexts;
CShinyText CShinyTexts::aShinyTexts[NUMSHINYTEXTS]; CShinyText CShinyTexts::aShinyTexts[NUMSHINYTEXTS];

View File

@ -9,10 +9,29 @@ public:
static void Shutdown(void); static void Shutdown(void);
}; };
class CMotionBlurStreaks class CRegisteredMotionBlurStreak
{ {
public: public:
static void RegisterStreak(int32 id, uint8 r, uint8 g, uint8 b, CVector p1, CVector p2); uintptr m_id;
uint8 m_red;
uint8 m_green;
uint8 m_blue;
CVector m_pos1[3];
CVector m_pos2[3];
bool m_isValid[3];
void Update(void);
void Render(void);
};
class CMotionBlurStreaks
{
static CRegisteredMotionBlurStreak aStreaks[NUMMBLURSTREAKS];
public:
static void Init(void);
static void Update(void);
static void RegisterStreak(uintptr id, uint8 r, uint8 g, uint8 b, CVector p1, CVector p2);
static void Render(void);
}; };
struct CBulletTrace struct CBulletTrace
@ -29,7 +48,7 @@ struct CBulletTrace
class CBulletTraces class CBulletTraces
{ {
public: public:
static CBulletTrace (&aTraces)[NUMBULLETTRACES]; static CBulletTrace aTraces[NUMBULLETTRACES];
static void Init(void); static void Init(void);
static void AddTrace(CVector*, CVector*); static void AddTrace(CVector*, CVector*);
@ -84,9 +103,9 @@ public:
static void Render(); static void Render();
static void Update(); static void Update();
static C3dMarker(&m_aMarkerArray)[NUM3DMARKERS]; static C3dMarker m_aMarkerArray[NUM3DMARKERS];
static int32 &NumActiveMarkers; static int32 NumActiveMarkers;
static RpClump* (&m_pRpClumpArray)[NUMMARKERTYPES]; static RpClump* m_pRpClumpArray[NUMMARKERTYPES];
}; };
enum enum