mirror of
https://github.com/halpz/re3.git
synced 2025-07-21 16:49:48 +00:00
miami shadows
This commit is contained in:
267
src/render/CutsceneShadow.cpp
Normal file
267
src/render/CutsceneShadow.cpp
Normal file
@ -0,0 +1,267 @@
|
||||
#include "common.h"
|
||||
#include "main.h"
|
||||
#include "rwcore.h"
|
||||
#include "rwplcore.h"
|
||||
#include "CutsceneShadow.h"
|
||||
#include "RwHelper.h"
|
||||
|
||||
#define DLIGHT_VALUE 0.8f /* Directional light intensity */
|
||||
|
||||
|
||||
CCutsceneShadow::CCutsceneShadow()
|
||||
{
|
||||
m_pAtomic = NULL;
|
||||
m_nRwObjectType = -1;
|
||||
m_pLight = NULL;
|
||||
m_nBlurPasses = 0;
|
||||
m_bResample = false;
|
||||
m_bGradient = false;
|
||||
}
|
||||
|
||||
CCutsceneShadow::~CCutsceneShadow()
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
|
||||
bool
|
||||
CCutsceneShadow::Create(RwObject *object, int32 rasterSize, bool resample, int32 blurPasses, bool gradient)
|
||||
{
|
||||
RwRGBAReal color;
|
||||
RwFrame *frame;
|
||||
|
||||
if (!object)
|
||||
return false;
|
||||
|
||||
m_pLight = RpLightCreate(rpLIGHTDIRECTIONAL);
|
||||
|
||||
if (!m_pLight)
|
||||
return false;
|
||||
|
||||
color.red = color.green = color.blue = DLIGHT_VALUE;
|
||||
color.alpha = 0.0f;
|
||||
|
||||
RpLightSetColor(m_pLight, &color);
|
||||
|
||||
frame = RwFrameCreate();
|
||||
RpLightSetFrame(m_pLight, frame);
|
||||
|
||||
SetLightProperties(180.0f, 90.0f, false);
|
||||
|
||||
m_pObject = object;
|
||||
m_nRwObjectType = RwObjectGetType(m_pObject);
|
||||
|
||||
switch ( m_nRwObjectType )
|
||||
{
|
||||
case rpCLUMP:
|
||||
{
|
||||
RpClumpGetBoundingSphere(m_pClump, &m_BoundingSphere, 1);
|
||||
m_BaseSphere.radius = m_BoundingSphere.radius;
|
||||
RwV3dTransformPoints(&m_BaseSphere.center, &m_BoundingSphere.center, 1, RwFrameGetMatrix(RpClumpGetFrame(m_pClump)));
|
||||
break;
|
||||
}
|
||||
|
||||
case rpATOMIC:
|
||||
{
|
||||
m_BoundingSphere = *RpAtomicGetBoundingSphere(m_pAtomic);
|
||||
m_BaseSphere.radius = m_BoundingSphere.radius;
|
||||
RwV3dTransformPoints(&m_BaseSphere.center, &m_BoundingSphere.center, 1, RwFrameGetMatrix(RpAtomicGetFrame(m_pAtomic)));
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
Destroy();
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( !m_Camera.Create(rasterSize) )
|
||||
{
|
||||
Destroy();
|
||||
return false;
|
||||
}
|
||||
|
||||
m_nBlurPasses = blurPasses;
|
||||
m_bResample = resample;
|
||||
m_bGradient = gradient;
|
||||
|
||||
if ( m_bResample && !m_ResampleCamera.Create(rasterSize - 1) )
|
||||
{
|
||||
Destroy();
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( m_nBlurPasses != 0 )
|
||||
{
|
||||
if ( !m_BlurCamera.Create(resample ? rasterSize - 1 : rasterSize) )
|
||||
{
|
||||
Destroy();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if ( m_bGradient )
|
||||
{
|
||||
if ( !m_GradientCamera.Create(resample ? rasterSize - 1 : rasterSize) )
|
||||
{
|
||||
Destroy();
|
||||
return false;
|
||||
}
|
||||
|
||||
m_GradientCamera.MakeGradientRaster();
|
||||
}
|
||||
|
||||
m_Camera.SetLight(m_pLight);
|
||||
|
||||
switch ( m_nRwObjectType )
|
||||
{
|
||||
case rpATOMIC:
|
||||
m_Camera.SetFrustum(1.1f * m_BoundingSphere.radius);
|
||||
break;
|
||||
|
||||
case rpCLUMP:
|
||||
m_Camera.SetFrustum(1.1f * m_BoundingSphere.radius);
|
||||
break;
|
||||
}
|
||||
|
||||
m_Camera.SetCenter(&m_BaseSphere.center);
|
||||
return true;
|
||||
}
|
||||
|
||||
RwFrame *
|
||||
CCutsceneShadow::SetLightProperties(float angleY, float angleX, bool setLight)
|
||||
{
|
||||
RwFrame *frame;
|
||||
static RwV3d Xaxis = { 1.0f, 0.0f, 0.0f };
|
||||
static RwV3d Yaxis = { 0.0f, 1.0f, 0.0f };
|
||||
|
||||
frame = RpLightGetFrame(m_pLight);
|
||||
if ( !frame )
|
||||
return NULL;
|
||||
|
||||
RwFrameRotate(frame, &Yaxis, angleY, rwCOMBINEREPLACE);
|
||||
RwFrameRotate(frame, &Xaxis, angleX, rwCOMBINEPOSTCONCAT);
|
||||
|
||||
if ( setLight )
|
||||
m_Camera.SetLight(m_pLight);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
bool
|
||||
CCutsceneShadow::IsInitialized()
|
||||
{
|
||||
return m_pObject != NULL;
|
||||
}
|
||||
|
||||
void
|
||||
CCutsceneShadow::Destroy()
|
||||
{
|
||||
m_Camera.Destroy();
|
||||
m_ResampleCamera.Destroy();
|
||||
m_BlurCamera.Destroy();
|
||||
m_GradientCamera.Destroy();
|
||||
|
||||
m_pAtomic = NULL;
|
||||
|
||||
m_nRwObjectType = -1;
|
||||
|
||||
if (m_pLight)
|
||||
{
|
||||
RwFrame *frame = RpLightGetFrame(m_pLight);
|
||||
RpLightSetFrame(m_pLight, NULL);
|
||||
RwFrameDestroy(frame);
|
||||
RpLightDestroy(m_pLight);
|
||||
m_pLight = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
RwRaster *
|
||||
CCutsceneShadow::Update()
|
||||
{
|
||||
switch ( m_nRwObjectType )
|
||||
{
|
||||
case rpCLUMP:
|
||||
RwV3dTransformPoints(&m_BaseSphere.center, &m_BoundingSphere.center, 1, RwFrameGetMatrix(RpClumpGetFrame(m_pClump)));
|
||||
break;
|
||||
|
||||
case rpATOMIC:
|
||||
RwV3dTransformPoints(&m_BaseSphere.center, &m_BoundingSphere.center, 1, RwFrameGetMatrix(RpAtomicGetFrame(m_pAtomic)));
|
||||
break;
|
||||
}
|
||||
|
||||
m_Camera.SetCenter(&m_BaseSphere.center);
|
||||
|
||||
switch ( m_nRwObjectType )
|
||||
{
|
||||
case rpCLUMP:
|
||||
m_Camera.Update(m_pClump);
|
||||
break;
|
||||
|
||||
case rpATOMIC:
|
||||
m_Camera.Update(m_pAtomic);
|
||||
break;
|
||||
}
|
||||
|
||||
RwRaster *raster = m_Camera.GetRwRenderRaster();
|
||||
|
||||
if ( m_bResample )
|
||||
return m_ResampleCamera.RasterResample(raster);
|
||||
|
||||
if ( m_nBlurPasses )
|
||||
return m_BlurCamera.RasterBlur(raster, m_nBlurPasses);
|
||||
|
||||
if ( m_bGradient )
|
||||
return m_GradientCamera.RasterGradient(raster);
|
||||
|
||||
return raster;
|
||||
}
|
||||
|
||||
RwTexture *
|
||||
CCutsceneShadow::UpdateForCutscene()
|
||||
{
|
||||
Update();
|
||||
return GetShadowRwTexture();
|
||||
}
|
||||
|
||||
CShadowCamera *
|
||||
CCutsceneShadow::GetShadowCamera(int32 camType)
|
||||
{
|
||||
switch ( camType )
|
||||
{
|
||||
case RESAMPLE:
|
||||
return &m_ResampleCamera;
|
||||
break;
|
||||
|
||||
case BLUR:
|
||||
return &m_BlurCamera;
|
||||
break;
|
||||
|
||||
case GRADIENT:
|
||||
return &m_GradientCamera;
|
||||
break;
|
||||
|
||||
default:
|
||||
return &m_Camera;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
RwTexture *
|
||||
CCutsceneShadow::GetShadowRwTexture()
|
||||
{
|
||||
if ( m_bResample )
|
||||
return m_ResampleCamera.GetRwRenderTexture();
|
||||
else
|
||||
return m_Camera.GetRwRenderTexture();
|
||||
}
|
||||
|
||||
void
|
||||
CCutsceneShadow::DrawBorderAroundTexture(RwRGBA const& color)
|
||||
{
|
||||
if ( m_bResample )
|
||||
m_ResampleCamera.DrawOutlineBorder(color);
|
||||
else
|
||||
m_Camera.DrawOutlineBorder(color);
|
||||
}
|
54
src/render/CutsceneShadow.h
Normal file
54
src/render/CutsceneShadow.h
Normal file
@ -0,0 +1,54 @@
|
||||
#pragma once
|
||||
#include "ShadowCamera.h"
|
||||
|
||||
class CCutsceneShadow
|
||||
{
|
||||
public:
|
||||
enum
|
||||
{
|
||||
RASTER = 0,
|
||||
RESAMPLE,
|
||||
BLUR,
|
||||
GRADIENT,
|
||||
};
|
||||
|
||||
CShadowCamera m_Camera;
|
||||
bool m_bResample;
|
||||
char _pad0[3];
|
||||
CShadowCamera m_ResampleCamera;
|
||||
int32 m_nBlurPasses;
|
||||
CShadowCamera m_BlurCamera;
|
||||
bool m_bGradient;
|
||||
char _pad1[3];
|
||||
CShadowCamera m_GradientCamera;
|
||||
|
||||
union
|
||||
{
|
||||
RwObject *m_pObject;
|
||||
RpAtomic *m_pAtomic;
|
||||
RpClump *m_pClump;
|
||||
};
|
||||
|
||||
int m_nRwObjectType;
|
||||
RpLight *m_pLight;
|
||||
RwSphere m_BoundingSphere;
|
||||
RwSphere m_BaseSphere;
|
||||
|
||||
CCutsceneShadow();
|
||||
~CCutsceneShadow();
|
||||
|
||||
RwSphere &GetBaseSphere()
|
||||
{
|
||||
return m_BaseSphere;
|
||||
}
|
||||
|
||||
bool Create(RwObject *object, int32 rasterSize, bool resample, int32 blurPasses, bool gradient);
|
||||
RwFrame *SetLightProperties(float angleY, float angleX, bool setLight);
|
||||
bool IsInitialized();
|
||||
void Destroy();
|
||||
RwRaster *Update();
|
||||
RwTexture *UpdateForCutscene();
|
||||
CShadowCamera *GetShadowCamera(int32 camType = RASTER);
|
||||
RwTexture *GetShadowRwTexture();
|
||||
void DrawBorderAroundTexture(RwRGBA const& color);
|
||||
};
|
551
src/render/ShadowCamera.cpp
Normal file
551
src/render/ShadowCamera.cpp
Normal file
@ -0,0 +1,551 @@
|
||||
#include "common.h"
|
||||
#include "rwcore.h"
|
||||
#include "ShadowCamera.h"
|
||||
#include "RwHelper.h"
|
||||
|
||||
#define TEXELOFFSET 0.5f
|
||||
|
||||
RpAtomic *ShadowRenderCallBack(RpAtomic *atomic, void *data)
|
||||
{
|
||||
RpAtomicCallBackRender savedCB = RpAtomicGetRenderCallBack(atomic);
|
||||
RpAtomicSetRenderCallBack(atomic, AtomicDefaultRenderCallBack);
|
||||
RpAtomicRender(atomic);
|
||||
RpAtomicSetRenderCallBack(atomic, savedCB);
|
||||
return atomic;
|
||||
}
|
||||
|
||||
CShadowCamera::CShadowCamera()
|
||||
{
|
||||
m_pCamera = NULL;
|
||||
m_pTexture = NULL;
|
||||
}
|
||||
|
||||
CShadowCamera::~CShadowCamera()
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
|
||||
void
|
||||
CShadowCamera::Destroy()
|
||||
{
|
||||
if ( m_pCamera )
|
||||
{
|
||||
RwRaster *raster;
|
||||
RwFrame *frame;
|
||||
|
||||
frame = RwCameraGetFrame(m_pCamera);
|
||||
|
||||
if ( frame )
|
||||
{
|
||||
RwCameraSetFrame(m_pCamera, NULL);
|
||||
RwFrameDestroy(frame);
|
||||
}
|
||||
|
||||
raster = RwCameraGetZRaster(m_pCamera);
|
||||
if ( raster )
|
||||
{
|
||||
RwCameraSetZRaster(m_pCamera, NULL);
|
||||
RwRasterDestroy(raster);
|
||||
}
|
||||
|
||||
raster = RwCameraGetRaster(m_pCamera);
|
||||
if ( raster )
|
||||
{
|
||||
RwCameraSetRaster(m_pCamera, NULL);
|
||||
RwRasterDestroy(raster);
|
||||
}
|
||||
|
||||
if ( m_pTexture )
|
||||
{
|
||||
RwTextureSetRaster(m_pTexture, NULL);
|
||||
RwTextureDestroy(m_pTexture);
|
||||
m_pTexture = NULL;
|
||||
}
|
||||
|
||||
RwCameraDestroy(m_pCamera);
|
||||
m_pCamera = NULL;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
RwCamera *
|
||||
CShadowCamera::Create(int32 rasterSize)
|
||||
{
|
||||
int32 size = 1 << rasterSize;
|
||||
|
||||
m_pCamera = RwCameraCreate();
|
||||
ASSERT(m_pCamera != NULL);
|
||||
|
||||
if ( m_pCamera )
|
||||
{
|
||||
RwCameraSetFrame(m_pCamera, RwFrameCreate());
|
||||
|
||||
if( RwCameraGetFrame(m_pCamera) )
|
||||
{
|
||||
RwRaster *zRaster = RwRasterCreate(size, size, 0, rwRASTERTYPEZBUFFER);
|
||||
ASSERT(zRaster != NULL);
|
||||
|
||||
if ( zRaster )
|
||||
{
|
||||
RwCameraSetZRaster(m_pCamera, zRaster);
|
||||
|
||||
RwRaster *raster = RwRasterCreate(size, size, 0, rwRASTERTYPECAMERATEXTURE);
|
||||
ASSERT(raster != NULL);
|
||||
|
||||
if ( raster )
|
||||
{
|
||||
RwCameraSetRaster(m_pCamera, raster);
|
||||
m_pTexture = RwTextureCreate(raster);
|
||||
ASSERT(m_pTexture != NULL);
|
||||
|
||||
if ( m_pTexture )
|
||||
{
|
||||
RwTextureSetAddressing(m_pTexture, rwTEXTUREADDRESSCLAMP);
|
||||
RwTextureSetFilterMode(m_pTexture, rwFILTERLINEAR);
|
||||
RwCameraSetProjection(m_pCamera, rwPARALLEL);
|
||||
return (m_pCamera);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Destroy();
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
RwCamera *
|
||||
CShadowCamera::SetFrustum(float objectRadius)
|
||||
{
|
||||
ASSERT(m_pCamera != NULL);
|
||||
|
||||
RwV2d vw;
|
||||
|
||||
RwCameraSetFarClipPlane (m_pCamera, 2.0f * objectRadius);
|
||||
RwCameraSetNearClipPlane(m_pCamera, 0.001f * objectRadius);
|
||||
|
||||
vw.x = objectRadius;
|
||||
vw.y = objectRadius;
|
||||
RwCameraSetViewWindow(m_pCamera, &vw);
|
||||
|
||||
return m_pCamera;
|
||||
}
|
||||
|
||||
RwCamera *
|
||||
CShadowCamera::SetLight(RpLight *light)
|
||||
{
|
||||
ASSERT(light != NULL);
|
||||
ASSERT(m_pCamera != NULL);
|
||||
|
||||
RwFrame *camFrame = RwCameraGetFrame(m_pCamera);
|
||||
RwMatrix *camMatrix = RwFrameGetMatrix(camFrame);
|
||||
RwFrame *lightFrame = RpLightGetFrame(light);
|
||||
RwMatrix *lightMatrix = RwFrameGetMatrix(lightFrame);
|
||||
|
||||
*RwMatrixGetRight(camMatrix) = *RwMatrixGetRight(lightMatrix);
|
||||
*RwMatrixGetUp(camMatrix) = *RwMatrixGetUp(lightMatrix);
|
||||
*RwMatrixGetAt(camMatrix) = *RwMatrixGetAt(lightMatrix);
|
||||
|
||||
//RwMatrixCopy(RwFrameGetMatrix(camFrame), RwFrameGetMatrix(lightFrame));
|
||||
|
||||
RwMatrixUpdate(RwFrameGetMatrix(camFrame));
|
||||
RwFrameUpdateObjects(camFrame);
|
||||
|
||||
return m_pCamera;
|
||||
}
|
||||
|
||||
RwCamera *
|
||||
CShadowCamera::SetCenter(RwV3d *center)
|
||||
{
|
||||
ASSERT(center != NULL);
|
||||
ASSERT(m_pCamera != NULL);
|
||||
|
||||
RwFrame *camFrame = RwCameraGetFrame(m_pCamera);
|
||||
RwMatrix *camMatrix = RwFrameGetMatrix(camFrame);
|
||||
|
||||
*RwMatrixGetPos(camMatrix) = *center;
|
||||
|
||||
RwV3dIncrementScaled(RwMatrixGetPos(camMatrix), RwMatrixGetAt(camMatrix), -0.5f * RwCameraGetFarClipPlane(m_pCamera));
|
||||
|
||||
RwMatrixUpdate(camMatrix);
|
||||
RwFrameUpdateObjects(camFrame);
|
||||
RwFrameOrthoNormalize(camFrame);
|
||||
|
||||
return m_pCamera;
|
||||
}
|
||||
|
||||
RwCamera *
|
||||
CShadowCamera::Update(RpClump *clump)
|
||||
{
|
||||
ASSERT(clump != NULL);
|
||||
ASSERT(m_pCamera != NULL);
|
||||
|
||||
RwUInt32 flags;
|
||||
RpGeometry *geometry;
|
||||
|
||||
RwRGBA bgColor = { 255, 255, 255, 0 };
|
||||
|
||||
RwCameraClear(m_pCamera, &bgColor, rwCAMERACLEARZ | rwCAMERACLEARIMAGE);
|
||||
|
||||
if ( RwCameraBeginUpdate(m_pCamera) )
|
||||
{
|
||||
geometry = GetFirstAtomic(clump)->geometry;
|
||||
ASSERT(geometry != NULL);
|
||||
|
||||
flags = RpGeometryGetFlags(geometry);
|
||||
|
||||
RpGeometrySetFlags(geometry, flags & ~(rpGEOMETRYPRELIT|rpGEOMETRYLIGHT
|
||||
|rpGEOMETRYTEXTURED|rpGEOMETRYTEXTURED2|rpGEOMETRYMODULATEMATERIALCOLOR));
|
||||
|
||||
RpClumpForAllAtomics(clump, ShadowRenderCallBack, NULL);
|
||||
|
||||
RpGeometrySetFlags(geometry, flags);
|
||||
|
||||
InvertRaster();
|
||||
RwCameraEndUpdate(m_pCamera);
|
||||
}
|
||||
|
||||
return m_pCamera;
|
||||
}
|
||||
|
||||
RwCamera *
|
||||
CShadowCamera::Update(RpAtomic *atomic)
|
||||
{
|
||||
ASSERT(atomic != NULL);
|
||||
ASSERT(m_pCamera != NULL);
|
||||
|
||||
RwUInt32 flags;
|
||||
RpGeometry *geometry;
|
||||
|
||||
RwRGBA bgColor = { 255, 255, 255, 0 };
|
||||
|
||||
RwCameraClear(m_pCamera, &bgColor, rwCAMERACLEARZ | rwCAMERACLEARIMAGE);
|
||||
|
||||
if ( RwCameraBeginUpdate(m_pCamera) )
|
||||
{
|
||||
geometry = RpAtomicGetGeometry(atomic);
|
||||
ASSERT(geometry != NULL);
|
||||
flags = RpGeometryGetFlags(geometry);
|
||||
|
||||
RpGeometrySetFlags(geometry, flags & ~(rpGEOMETRYPRELIT|rpGEOMETRYLIGHT
|
||||
|rpGEOMETRYTEXTURED|rpGEOMETRYTEXTURED2|rpGEOMETRYMODULATEMATERIALCOLOR|rpGEOMETRYNORMALS));
|
||||
|
||||
ShadowRenderCallBack(atomic, NULL);
|
||||
|
||||
RpGeometrySetFlags(geometry, flags);
|
||||
|
||||
InvertRaster();
|
||||
RwCameraEndUpdate(m_pCamera);
|
||||
}
|
||||
|
||||
return m_pCamera;
|
||||
}
|
||||
|
||||
void
|
||||
CShadowCamera::InvertRaster()
|
||||
{
|
||||
ASSERT(m_pCamera != NULL);
|
||||
|
||||
RwIm2DVertex vx[4];
|
||||
float crw, crh;
|
||||
RwRaster *raster;
|
||||
float recipZ;
|
||||
|
||||
raster = RwCameraGetRaster(m_pCamera);
|
||||
ASSERT(raster != NULL);
|
||||
|
||||
crw = (float)RwRasterGetWidth(raster);
|
||||
crh = (float)RwRasterGetHeight(raster);
|
||||
|
||||
recipZ = 1.0f / RwCameraGetNearClipPlane(m_pCamera);
|
||||
|
||||
RwIm2DVertexSetScreenX (&vx[0], 0.0f);
|
||||
RwIm2DVertexSetScreenY (&vx[0], 0.0f);
|
||||
RwIm2DVertexSetScreenZ (&vx[0], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetRecipCameraZ(&vx[0], recipZ);
|
||||
RwIm2DVertexSetIntRGBA (&vx[0], 255, 255, 255, 255);
|
||||
|
||||
RwIm2DVertexSetScreenX (&vx[1], 0.0f);
|
||||
RwIm2DVertexSetScreenY (&vx[1], crh);
|
||||
RwIm2DVertexSetScreenZ (&vx[1], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetRecipCameraZ(&vx[1], recipZ);
|
||||
RwIm2DVertexSetIntRGBA (&vx[1], 255, 255, 255, 255);
|
||||
|
||||
RwIm2DVertexSetScreenX (&vx[2], crw);
|
||||
RwIm2DVertexSetScreenY (&vx[2], 0.0f);
|
||||
RwIm2DVertexSetScreenZ (&vx[2], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetRecipCameraZ(&vx[2], recipZ);
|
||||
RwIm2DVertexSetIntRGBA (&vx[2], 255, 255, 255, 255);
|
||||
|
||||
RwIm2DVertexSetScreenX (&vx[3], crw);
|
||||
RwIm2DVertexSetScreenY (&vx[3], crh);
|
||||
RwIm2DVertexSetScreenZ (&vx[3], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetRecipCameraZ(&vx[3], recipZ);
|
||||
RwIm2DVertexSetIntRGBA (&vx[3], 255, 255, 255, 255);
|
||||
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void *)NULL);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDINVDESTCOLOR);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDZERO);
|
||||
|
||||
RwIm2DRenderPrimitive(rwPRIMTYPETRISTRIP, vx, 4);
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDINVSRCALPHA);
|
||||
}
|
||||
|
||||
RwRaster *
|
||||
CShadowCamera::MakeGradientRaster()
|
||||
{
|
||||
ASSERT(m_pCamera != NULL);
|
||||
|
||||
RwIm2DVertex vx[2];
|
||||
|
||||
if ( !m_pCamera )
|
||||
return NULL;
|
||||
|
||||
float recipCamZ = 1.0f / RwCameraGetNearClipPlane(m_pCamera);
|
||||
|
||||
RwRaster *raster = RwCameraGetRaster(m_pCamera);
|
||||
ASSERT(raster != NULL);
|
||||
|
||||
float width = (float)RwRasterGetWidth(raster);
|
||||
float height = (float)RwRasterGetHeight(raster);
|
||||
|
||||
if ( height < 1 )
|
||||
return NULL;
|
||||
|
||||
if ( RwCameraBeginUpdate(m_pCamera) )
|
||||
{
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void *)rwFILTERNAFILTERMODE);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDZERO);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDINVDESTCOLOR);
|
||||
RwRenderStateSet(rwRENDERSTATESHADEMODE, (void *)rwSHADEMODEFLAT);
|
||||
|
||||
float color = 255.0f;
|
||||
float step = (-191.0f / height);
|
||||
|
||||
for ( int32 i = 0; i < height; i++ )
|
||||
{
|
||||
RwIm2DVertexSetScreenX (&vx[0], 0.0f);
|
||||
RwIm2DVertexSetScreenY (&vx[0], i);
|
||||
RwIm2DVertexSetScreenZ (&vx[0], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetRecipCameraZ(&vx[0], recipCamZ);
|
||||
RwIm2DVertexSetIntRGBA (&vx[0], (uint32)color, (uint32)color, (uint32)color, (uint32)color);
|
||||
|
||||
RwIm2DVertexSetScreenX (&vx[1], width - 1);
|
||||
RwIm2DVertexSetScreenY (&vx[1], i);
|
||||
RwIm2DVertexSetScreenZ (&vx[1], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetRecipCameraZ(&vx[1], recipCamZ);
|
||||
RwIm2DVertexSetIntRGBA (&vx[1], (uint32)color, (uint32)color, (uint32)color, (uint32)color);
|
||||
|
||||
RwIm2DRenderLine(vx, 2, 0, 1);
|
||||
|
||||
color += step;
|
||||
}
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDINVSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATESHADEMODE, (void *)rwSHADEMODEGOURAUD);
|
||||
|
||||
RwCameraEndUpdate(m_pCamera);
|
||||
}
|
||||
|
||||
return raster;
|
||||
}
|
||||
|
||||
RwRaster *
|
||||
CShadowCamera::RasterResample(RwRaster *dstRaster)
|
||||
{
|
||||
ASSERT(dstRaster != NULL);
|
||||
ASSERT(m_pCamera != NULL);
|
||||
|
||||
if ( !m_pCamera )
|
||||
return NULL;
|
||||
|
||||
RwRaster *raster = RwCameraGetRaster(m_pCamera);
|
||||
ASSERT(raster != NULL);
|
||||
|
||||
float size = (float) RwRasterGetWidth(raster);
|
||||
float uvOffset = TEXELOFFSET / size;
|
||||
float recipCamZ = 1.0f / RwCameraGetNearClipPlane(m_pCamera);
|
||||
|
||||
if ( RwCameraBeginUpdate(m_pCamera) )
|
||||
{
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDONE);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDZERO);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void *)rwFILTERLINEAR);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void *)dstRaster);
|
||||
|
||||
Im2DRenderQuad(0.0f, 0.0f, size, size, RwIm2DGetNearScreenZ(), recipCamZ, uvOffset);
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDINVSRCALPHA);
|
||||
|
||||
RwCameraEndUpdate(m_pCamera);
|
||||
}
|
||||
|
||||
return raster;
|
||||
}
|
||||
|
||||
RwRaster *
|
||||
CShadowCamera::RasterBlur(RwRaster *dstRaster, int32 numPasses)
|
||||
{
|
||||
ASSERT(dstRaster != NULL);
|
||||
ASSERT(m_pCamera != NULL);
|
||||
|
||||
if ( !m_pCamera )
|
||||
return NULL;
|
||||
|
||||
RwRaster *raster = RwCameraGetRaster(m_pCamera);
|
||||
ASSERT(raster != NULL);
|
||||
|
||||
float size = (float) RwRasterGetWidth(dstRaster);
|
||||
float recipCamZ = 1.0f / RwCameraGetNearClipPlane(m_pCamera);
|
||||
|
||||
for (int i = 0; i < numPasses; i++ )
|
||||
{
|
||||
RwCameraSetRaster(m_pCamera, raster);
|
||||
|
||||
if ( RwCameraBeginUpdate(m_pCamera) )
|
||||
{
|
||||
if ( i == 0 )
|
||||
{
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDONE);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDZERO);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void *)rwFILTERLINEAR);
|
||||
}
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void *)dstRaster);
|
||||
Im2DRenderQuad(0.0f, 0.0f, size, size, RwIm2DGetNearScreenZ(), recipCamZ, 1.0f / size);
|
||||
RwCameraEndUpdate(m_pCamera);
|
||||
}
|
||||
|
||||
RwCameraSetRaster(m_pCamera, dstRaster);
|
||||
|
||||
if ( RwCameraBeginUpdate(m_pCamera) )
|
||||
{
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void *)raster);
|
||||
Im2DRenderQuad(0.0f, 0.0f, size, size, RwIm2DGetNearScreenZ(), recipCamZ, 0);
|
||||
|
||||
if ( i == numPasses - 1 )
|
||||
{
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDINVSRCALPHA);
|
||||
}
|
||||
|
||||
RwCameraEndUpdate(m_pCamera);
|
||||
}
|
||||
}
|
||||
|
||||
RwCameraSetRaster(m_pCamera, raster);
|
||||
|
||||
return dstRaster;
|
||||
}
|
||||
|
||||
RwRaster *
|
||||
CShadowCamera::RasterGradient(RwRaster *dstRaster)
|
||||
{
|
||||
ASSERT(dstRaster != NULL);
|
||||
ASSERT(m_pCamera != NULL);
|
||||
|
||||
RwRaster *raster = RwCameraGetRaster(m_pCamera);
|
||||
ASSERT(raster != NULL);
|
||||
|
||||
float size = (float)RwRasterGetWidth(dstRaster);
|
||||
float recipCamZ = 1.0f / RwCameraGetNearClipPlane(m_pCamera);
|
||||
|
||||
RwCameraSetRaster(m_pCamera, dstRaster);
|
||||
|
||||
if ( RwCameraBeginUpdate(m_pCamera) )
|
||||
{
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDZERO);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDSRCCOLOR);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void *)rwFILTERLINEAR);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void *)raster);
|
||||
|
||||
Im2DRenderQuad(0, 0, size, size, RwIm2DGetNearScreenZ(), recipCamZ, 0);
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDINVSRCALPHA);
|
||||
|
||||
RwCameraEndUpdate(m_pCamera);
|
||||
}
|
||||
|
||||
RwCameraSetRaster(m_pCamera, raster);
|
||||
|
||||
return dstRaster;
|
||||
}
|
||||
|
||||
RwRaster *CShadowCamera::DrawOutlineBorder(RwRGBA const& color)
|
||||
{
|
||||
ASSERT(m_pCamera != NULL);
|
||||
|
||||
RwIm2DVertex vx[4];
|
||||
RwImVertexIndex ix[5];
|
||||
|
||||
RwRaster *raster = RwCameraGetRaster(m_pCamera);
|
||||
ASSERT(raster != NULL);
|
||||
|
||||
float size = (float)RwRasterGetWidth(raster) - 1.0f;
|
||||
float recipCamZ = 1.0f / RwCameraGetNearClipPlane(m_pCamera);
|
||||
|
||||
RwIm2DVertexSetScreenX (&vx[0], 0.0f);
|
||||
RwIm2DVertexSetScreenY (&vx[0], 0.0f);
|
||||
RwIm2DVertexSetScreenZ (&vx[0], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetIntRGBA (&vx[0], color.red, color.green, color.blue, color.alpha);
|
||||
RwIm2DVertexSetRecipCameraZ(&vx[0], recipCamZ);
|
||||
|
||||
RwIm2DVertexSetScreenX (&vx[1], size);
|
||||
RwIm2DVertexSetScreenY (&vx[1], 0.0f);
|
||||
RwIm2DVertexSetScreenZ (&vx[1], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetIntRGBA (&vx[1], color.red, color.green, color.blue, color.alpha);
|
||||
RwIm2DVertexSetRecipCameraZ(&vx[1], recipCamZ);
|
||||
|
||||
RwIm2DVertexSetScreenX (&vx[2], size);
|
||||
RwIm2DVertexSetScreenY (&vx[2], size);
|
||||
RwIm2DVertexSetScreenZ (&vx[2], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetIntRGBA (&vx[2], color.red, color.green, color.blue, color.alpha);
|
||||
RwIm2DVertexSetRecipCameraZ(&vx[2], recipCamZ);
|
||||
|
||||
RwIm2DVertexSetScreenX (&vx[3], 0.0f);
|
||||
RwIm2DVertexSetScreenY (&vx[3], size);
|
||||
RwIm2DVertexSetScreenZ (&vx[3], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetIntRGBA (&vx[3], color.red, color.green, color.blue, color.alpha);
|
||||
RwIm2DVertexSetRecipCameraZ(&vx[3], recipCamZ);
|
||||
|
||||
ix[0] = 0;
|
||||
ix[4] = 0;
|
||||
ix[1] = 1;
|
||||
ix[2] = 2;
|
||||
ix[3] = 3;
|
||||
|
||||
if ( RwCameraBeginUpdate(m_pCamera) )
|
||||
{
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void *)NULL);
|
||||
|
||||
RwIm2DRenderIndexedPrimitive(rwPRIMTYPEPOLYLINE, vx, 4, ix, 5);
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)TRUE);
|
||||
|
||||
RwCameraEndUpdate(m_pCamera);
|
||||
}
|
||||
|
||||
return raster;
|
||||
}
|
54
src/render/ShadowCamera.h
Normal file
54
src/render/ShadowCamera.h
Normal file
@ -0,0 +1,54 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
class CShadowCamera
|
||||
{
|
||||
public:
|
||||
RwCamera *m_pCamera;
|
||||
RwTexture *m_pTexture;
|
||||
|
||||
CShadowCamera();
|
||||
~CShadowCamera();
|
||||
|
||||
RwCamera *Create(int32 rasterSize);
|
||||
void Destroy();
|
||||
|
||||
RwCamera *SetFrustum(float objectRadius);
|
||||
RwCamera *SetLight(RpLight *light);
|
||||
RwCamera *SetCenter(RwV3d *center);
|
||||
|
||||
RwCamera *Update(RpClump *clump);
|
||||
RwCamera *Update(RpAtomic *atomic);
|
||||
|
||||
void InvertRaster();
|
||||
|
||||
RwRaster* GetRwRenderRaster()
|
||||
{
|
||||
return RwCameraGetRaster(m_pCamera);
|
||||
}
|
||||
|
||||
// ShadowRasterRender(RwV2d *)
|
||||
// ApplyAlphaMapToRaster(void)
|
||||
|
||||
RwRaster *MakeGradientRaster();
|
||||
|
||||
RwTexture *GetRwRenderTexture()
|
||||
{
|
||||
return m_pTexture;
|
||||
}
|
||||
|
||||
RwRaster* GetRwZRaster()
|
||||
{
|
||||
return RwCameraGetZRaster(m_pCamera);
|
||||
}
|
||||
|
||||
RwRaster *RasterResample(RwRaster *dstRaster);
|
||||
RwRaster *RasterBlur(RwRaster *dstRaster, int32 numPasses);
|
||||
RwRaster *RasterGradient(RwRaster *dstRaster);
|
||||
RwRaster *DrawOutlineBorder(RwRGBA const& color);
|
||||
|
||||
RwCamera *GetRwCamera()
|
||||
{
|
||||
return m_pCamera;
|
||||
}
|
||||
};
|
File diff suppressed because it is too large
Load Diff
@ -1,12 +1,19 @@
|
||||
#pragma once
|
||||
|
||||
#define MAX_STOREDSHADOWS 48
|
||||
#define MAX_POLYBUNCHES 300
|
||||
#define MAX_STATICSHADOWS 64
|
||||
#define MAX_POLYBUNCHES 380
|
||||
#define MAX_STATICSHADOWS 48
|
||||
#define MAX_PERMAMENTSHADOWS 48
|
||||
|
||||
|
||||
|
||||
class CEntity;
|
||||
class CPtrList;
|
||||
class CAutomobile;
|
||||
class CVehicle;
|
||||
class CPed;
|
||||
class CCutsceneShadow;
|
||||
class CCutsceneObject;
|
||||
|
||||
enum eShadowType
|
||||
{
|
||||
@ -27,6 +34,16 @@ enum eShadowTextureType
|
||||
SHADOWTEX_BLOOD
|
||||
};
|
||||
|
||||
enum VEH_SHD_TYPE
|
||||
{
|
||||
VEH_SHD_TYPE_CAR = 0,
|
||||
VEH_SHD_TYPE_BIKE,
|
||||
VEH_SHD_TYPE_HELI,
|
||||
VEH_SHD_TYPE_SEAPLANE,
|
||||
VEH_SHD_TYPE_RCPLANE,
|
||||
};
|
||||
|
||||
|
||||
class CStoredShadow
|
||||
{
|
||||
public:
|
||||
@ -35,6 +52,8 @@ public:
|
||||
CVector2D m_vecSide;
|
||||
float m_fZDistance;
|
||||
float m_fScale;
|
||||
RwTexture *m_pTexture;
|
||||
CCutsceneShadow *m_pCutsceneShadow;
|
||||
int16 m_nIntensity;
|
||||
uint8 m_ShadowType;
|
||||
uint8 m_nRed;
|
||||
@ -44,9 +63,9 @@ public:
|
||||
{
|
||||
uint8 bDrawOnWater : 1;
|
||||
uint8 bRendered : 1;
|
||||
//uint8 bDrawOnBuildings : 1;
|
||||
uint8 bDrawOnBuildings : 1;
|
||||
} m_nFlags;
|
||||
RwTexture *m_pTexture;
|
||||
|
||||
|
||||
CStoredShadow()
|
||||
{ }
|
||||
@ -57,11 +76,11 @@ VALIDATE_SIZE(CStoredShadow, 0x30);
|
||||
class CPolyBunch
|
||||
{
|
||||
public:
|
||||
int16 m_nNumVerts;
|
||||
CVector m_aVerts[7];
|
||||
CPolyBunch *m_pNext;
|
||||
int16 m_nNumVerts;
|
||||
uint8 m_aU[7];
|
||||
uint8 m_aV[7];
|
||||
CPolyBunch *m_pNext;
|
||||
|
||||
CPolyBunch()
|
||||
{ }
|
||||
@ -80,15 +99,16 @@ public:
|
||||
CVector2D m_vecSide;
|
||||
float m_fZDistance;
|
||||
float m_fScale;
|
||||
uint8 m_nType;
|
||||
RwTexture *m_pTexture;
|
||||
int16 m_nIntensity; // unsigned ?
|
||||
uint8 m_nType;
|
||||
uint8 m_nRed;
|
||||
uint8 m_nGreen;
|
||||
uint8 m_nBlue;
|
||||
bool m_bJustCreated;
|
||||
bool m_bRendered;
|
||||
bool m_bTemp;
|
||||
RwTexture *m_pTexture;
|
||||
|
||||
|
||||
CStaticShadow()
|
||||
{ }
|
||||
@ -106,14 +126,14 @@ public:
|
||||
CVector2D m_vecSide;
|
||||
float m_fZDistance;
|
||||
float m_fScale;
|
||||
uint32 m_nTimeCreated;
|
||||
uint32 m_nLifeTime;
|
||||
RwTexture *m_pTexture;
|
||||
int16 m_nIntensity;
|
||||
uint8 m_nType; // eShadowType
|
||||
uint8 m_nRed;
|
||||
uint8 m_nGreen;
|
||||
uint8 m_nBlue;
|
||||
uint32 m_nTimeCreated;
|
||||
uint32 m_nLifeTime;
|
||||
RwTexture *m_pTexture;
|
||||
|
||||
CPermanentShadow()
|
||||
{ }
|
||||
@ -121,60 +141,62 @@ public:
|
||||
|
||||
VALIDATE_SIZE(CPermanentShadow, 0x38);
|
||||
|
||||
class CPtrList;
|
||||
class CAutomobile;
|
||||
class CPed;
|
||||
|
||||
class CShadows
|
||||
{
|
||||
public:
|
||||
#if 1
|
||||
static int16 ShadowsStoredToBeRendered;
|
||||
static CStoredShadow asShadowsStored [MAX_STOREDSHADOWS];
|
||||
static CPolyBunch aPolyBunches [MAX_POLYBUNCHES];
|
||||
static CStaticShadow aStaticShadows [MAX_STATICSHADOWS];
|
||||
static CPolyBunch *pEmptyBunchList;
|
||||
static CPermanentShadow aPermanentShadows[MAX_PERMAMENTSHADOWS];
|
||||
#else
|
||||
static int16 &ShadowsStoredToBeRendered;
|
||||
static CStoredShadow (&asShadowsStored) [MAX_STOREDSHADOWS];
|
||||
static CPolyBunch (&aPolyBunches) [MAX_POLYBUNCHES];
|
||||
static CStaticShadow (&aStaticShadows) [MAX_STATICSHADOWS];
|
||||
static CPolyBunch *&pEmptyBunchList;
|
||||
static CPermanentShadow (&aPermanentShadows)[MAX_PERMAMENTSHADOWS];
|
||||
#endif
|
||||
|
||||
static void Init (void);
|
||||
static void Shutdown (void);
|
||||
static void AddPermanentShadow ( uint8 ShadowType, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue, float fZDistance, uint32 nTime, float fScale);
|
||||
static void StoreStaticShadow (uint32 nID, uint8 ShadowType, RwTexture *pTexture, Const CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue, float fZDistance, float fScale, float fDrawDistance, bool bTempShadow, float fUpDistance);
|
||||
static void StoreShadowToBeRendered ( uint8 ShadowType, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue);
|
||||
static void StoreShadowToBeRendered ( uint8 ShadowType, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue, float fZDistance, bool bDrawOnWater, float fScale);
|
||||
static void StoreShadowForCar (CAutomobile *pCar);
|
||||
static void StoreCarLightShadow (CAutomobile *pCar, int32 nID, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, uint8 nRed, uint8 nGreen, uint8 nBlue, float fMaxViewAngle);
|
||||
static void StoreShadowForPed (CPed *pPed, float fDisplacementX, float fDisplacementY, float fFrontX, float fFrontY, float fSideX, float fSideY);
|
||||
static void StoreShadowForPedObject (CEntity *pPedObject, float fDisplacementX, float fDisplacementY, float fFrontX, float fFrontY, float fSideX, float fSideY);
|
||||
static void StoreShadowForTree (CEntity *pTree);
|
||||
static void StoreShadowForPole (CEntity *pPole, float fOffsetX, float fOffsetY, float fOffsetZ, float fPoleHeight, float fPoleWidth, uint32 nID);
|
||||
static void SetRenderModeForShadowType (uint8 ShadowType);
|
||||
static void RenderStoredShadows (void);
|
||||
static void RenderStaticShadows (void);
|
||||
static void GeneratePolysForStaticShadow (int16 nStaticShadowID);
|
||||
static void CastShadowSectorList (CPtrList &PtrList, float fStartX, float fStartY, float fEndX, float fEndY,
|
||||
static void Init (void);
|
||||
static void Shutdown (void);
|
||||
static void AddPermanentShadow ( uint8 ShadowType, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue, float fZDistance, uint32 nTime, float fScale);
|
||||
|
||||
static bool StoreStaticShadow (uint32 nID, uint8 ShadowType, RwTexture *pTexture, Const CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue, float fZDistance, float fScale, float fDrawDistance, bool bTempShadow, float fUpDistance);
|
||||
static void StoreShadowToBeRendered ( uint8 ShadowType, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue);
|
||||
static void StoreShadowToBeRendered ( uint8 ShadowType, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue, float fZDistance, bool bDrawOnWater, float fScale, CCutsceneShadow *pShadow, bool bDrawOnBuildings);
|
||||
static void StoreShadowForVehicle (CVehicle *pCar, VEH_SHD_TYPE type);
|
||||
static void StoreCarLightShadow (CAutomobile *pCar, int32 nID, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, uint8 nRed, uint8 nGreen, uint8 nBlue, float fMaxViewAngle);
|
||||
static void StoreShadowForPed (CPed *pPed, float fDisplacementX, float fDisplacementY, float fFrontX, float fFrontY, float fSideX, float fSideY);
|
||||
static void StoreShadowForPedObject (CEntity *pPedObject, float fDisplacementX, float fDisplacementY, float fFrontX, float fFrontY, float fSideX, float fSideY);
|
||||
static void StoreShadowForCutscenePedObject(CCutsceneObject *pObject, float fDisplacementX, float fDisplacementY, float fFrontX, float fFrontY, float fSideX, float fSideY);
|
||||
static void StoreShadowForTree (CEntity *pTree);
|
||||
static void StoreShadowForPole (CEntity *pPole, float fOffsetX, float fOffsetY, float fOffsetZ, float fPoleHeight, float fPoleWidth, uint32 nID);
|
||||
static void SetRenderModeForShadowType (uint8 ShadowType);
|
||||
static void RenderStoredShadows (void);
|
||||
static void RenderStaticShadows (void);
|
||||
|
||||
static void GeneratePolysForStaticShadow (int16 nStaticShadowID);
|
||||
static void CastShadowSectorList (CPtrList &PtrList, float fStartX, float fStartY, float fEndX, float fEndY,
|
||||
CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue, float fZDistance, float fScale, CPolyBunch **ppPolyBunch);
|
||||
static void CastShadowEntity (CEntity *pEntity, float fStartX, float fStartY, float fEndX, float fEndY,
|
||||
|
||||
static void CastPlayerShadowSectorList (CPtrList &PtrList, float fStartX, float fStartY, float fEndX, float fEndY,
|
||||
CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue, float fZDistance, float fScale, CPolyBunch **ppPolyBunch);
|
||||
|
||||
static void CastCutsceneShadowSectorList (CPtrList &PtrList, float fStartX, float fStartY, float fEndX, float fEndY,
|
||||
CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue, float fZDistance, float fScale, CPolyBunch **ppPolyBunch, CCutsceneShadow *pShadow);
|
||||
|
||||
static void CastShadowEntityXY (CEntity *pEntity, float fStartX, float fStartY, float fEndX, float fEndY,
|
||||
CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue, float fZDistance, float fScale, CPolyBunch **ppPolyBunch);
|
||||
static void UpdateStaticShadows (void);
|
||||
static void UpdatePermanentShadows (void);
|
||||
static void CalcPedShadowValues (CVector vecLightDir, float *pfDisplacementX, float *pfDisplacementY, float *pfFrontX, float *pfFrontY, float *pfSideX, float *pfSideY);
|
||||
static void RenderExtraPlayerShadows (void);
|
||||
static void TidyUpShadows (void);
|
||||
static void RenderIndicatorShadow (uint32 nID, uint8 ShadowType, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity);
|
||||
|
||||
static void CastShadowEntityXYZ (CEntity *pEntity, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue, float fZDistance, float fScale, CPolyBunch **ppPolyBunch, CCutsceneShadow *pShadow);
|
||||
|
||||
static void UpdateStaticShadows (void);
|
||||
static void UpdatePermanentShadows (void);
|
||||
static void CalcPedShadowValues (CVector vecLightDir, float *pfDisplacementX, float *pfDisplacementY, float *pfFrontX, float *pfFrontY, float *pfSideX, float *pfSideY);
|
||||
static void RenderExtraPlayerShadows (void);
|
||||
static void TidyUpShadows (void);
|
||||
static void RenderIndicatorShadow (uint32 nID, uint8 ShadowType, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity);
|
||||
};
|
||||
|
||||
extern RwTexture *gpShadowCarTex;
|
||||
extern RwTexture *gpShadowPedTex;
|
||||
extern RwTexture *gpShadowHeliTex;
|
||||
extern RwTexture *gpShadowBikeTex;
|
||||
extern RwTexture *gpShadowBaronTex;
|
||||
extern RwTexture *gpShadowExplosionTex;
|
||||
extern RwTexture *gpShadowHeadLightsTex;
|
||||
extern RwTexture *gpOutline1Tex;
|
||||
@ -182,7 +204,6 @@ extern RwTexture *gpOutline2Tex;
|
||||
extern RwTexture *gpOutline3Tex;
|
||||
extern RwTexture *gpBloodPoolTex;
|
||||
extern RwTexture *gpReflectionTex;
|
||||
extern RwTexture *gpGoalMarkerTex;
|
||||
extern RwTexture *gpWalkDontTex;
|
||||
extern RwTexture *gpCrackedGlassTex;
|
||||
extern RwTexture *gpPostShadowTex;
|
||||
|
Reference in New Issue
Block a user