From 1803dcc873df329282adab46e1d42baa4b6ee45b Mon Sep 17 00:00:00 2001 From: Fire-Head Date: Wed, 29 Jul 2020 12:17:53 +0300 Subject: miami shadows --- src/render/CutsceneShadow.cpp | 267 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 267 insertions(+) create mode 100644 src/render/CutsceneShadow.cpp (limited to 'src/render/CutsceneShadow.cpp') diff --git a/src/render/CutsceneShadow.cpp b/src/render/CutsceneShadow.cpp new file mode 100644 index 00000000..4f9e7029 --- /dev/null +++ b/src/render/CutsceneShadow.cpp @@ -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); +} \ No newline at end of file -- cgit v1.2.3 From e2ded2d6ceaf3dcf183701074ea572de0bdb672e Mon Sep 17 00:00:00 2001 From: Fire-Head Date: Thu, 30 Jul 2020 01:32:21 +0300 Subject: cutsceneshadow fixes --- src/render/CutsceneShadow.cpp | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) (limited to 'src/render/CutsceneShadow.cpp') diff --git a/src/render/CutsceneShadow.cpp b/src/render/CutsceneShadow.cpp index 4f9e7029..14f6a09f 100644 --- a/src/render/CutsceneShadow.cpp +++ b/src/render/CutsceneShadow.cpp @@ -26,6 +26,8 @@ CCutsceneShadow::~CCutsceneShadow() bool CCutsceneShadow::Create(RwObject *object, int32 rasterSize, bool resample, int32 blurPasses, bool gradient) { + ASSERT(object != NULL); + RwRGBAReal color; RwFrame *frame; @@ -33,6 +35,7 @@ CCutsceneShadow::Create(RwObject *object, int32 rasterSize, bool resample, int32 return false; m_pLight = RpLightCreate(rpLIGHTDIRECTIONAL); + ASSERT(m_pLight != NULL); if (!m_pLight) return false; @@ -43,6 +46,8 @@ CCutsceneShadow::Create(RwObject *object, int32 rasterSize, bool resample, int32 RpLightSetColor(m_pLight, &color); frame = RwFrameCreate(); + ASSERT(frame != NULL); + RpLightSetFrame(m_pLight, frame); SetLightProperties(180.0f, 90.0f, false); @@ -132,11 +137,15 @@ CCutsceneShadow::Create(RwObject *object, int32 rasterSize, bool resample, int32 RwFrame * CCutsceneShadow::SetLightProperties(float angleY, float angleX, bool setLight) { + ASSERT(m_pLight != NULL); + RwFrame *frame; static RwV3d Xaxis = { 1.0f, 0.0f, 0.0f }; static RwV3d Yaxis = { 0.0f, 1.0f, 0.0f }; frame = RpLightGetFrame(m_pLight); + ASSERT(frame != NULL); + if ( !frame ) return NULL; @@ -183,10 +192,12 @@ CCutsceneShadow::Update() switch ( m_nRwObjectType ) { case rpCLUMP: + ASSERT(m_pClump != NULL); RwV3dTransformPoints(&m_BaseSphere.center, &m_BoundingSphere.center, 1, RwFrameGetMatrix(RpClumpGetFrame(m_pClump))); break; case rpATOMIC: + ASSERT(m_pAtomic != NULL); RwV3dTransformPoints(&m_BaseSphere.center, &m_BoundingSphere.center, 1, RwFrameGetMatrix(RpAtomicGetFrame(m_pAtomic))); break; } @@ -205,6 +216,7 @@ CCutsceneShadow::Update() } RwRaster *raster = m_Camera.GetRwRenderRaster(); + ASSERT(raster != NULL); if ( m_bResample ) return m_ResampleCamera.RasterResample(raster); @@ -230,22 +242,12 @@ 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; + case RESAMPLE: return &m_ResampleCamera; break; + case BLUR: return &m_BlurCamera; break; + case GRADIENT: return &m_GradientCamera; break; } + + return &m_Camera; } RwTexture * -- cgit v1.2.3 From 224fd77641271eb6cd466048fedcfb0592cb8fe4 Mon Sep 17 00:00:00 2001 From: Fire-Head Date: Fri, 31 Jul 2020 21:21:58 +0300 Subject: NULL -> nil --- src/render/CutsceneShadow.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'src/render/CutsceneShadow.cpp') diff --git a/src/render/CutsceneShadow.cpp b/src/render/CutsceneShadow.cpp index 14f6a09f..eeaebbc5 100644 --- a/src/render/CutsceneShadow.cpp +++ b/src/render/CutsceneShadow.cpp @@ -10,9 +10,9 @@ CCutsceneShadow::CCutsceneShadow() { - m_pAtomic = NULL; + m_pAtomic = nil; m_nRwObjectType = -1; - m_pLight = NULL; + m_pLight = nil; m_nBlurPasses = 0; m_bResample = false; m_bGradient = false; @@ -26,7 +26,7 @@ CCutsceneShadow::~CCutsceneShadow() bool CCutsceneShadow::Create(RwObject *object, int32 rasterSize, bool resample, int32 blurPasses, bool gradient) { - ASSERT(object != NULL); + ASSERT(object != nil); RwRGBAReal color; RwFrame *frame; @@ -35,7 +35,7 @@ CCutsceneShadow::Create(RwObject *object, int32 rasterSize, bool resample, int32 return false; m_pLight = RpLightCreate(rpLIGHTDIRECTIONAL); - ASSERT(m_pLight != NULL); + ASSERT(m_pLight != nil); if (!m_pLight) return false; @@ -46,7 +46,7 @@ CCutsceneShadow::Create(RwObject *object, int32 rasterSize, bool resample, int32 RpLightSetColor(m_pLight, &color); frame = RwFrameCreate(); - ASSERT(frame != NULL); + ASSERT(frame != nil); RpLightSetFrame(m_pLight, frame); @@ -137,17 +137,17 @@ CCutsceneShadow::Create(RwObject *object, int32 rasterSize, bool resample, int32 RwFrame * CCutsceneShadow::SetLightProperties(float angleY, float angleX, bool setLight) { - ASSERT(m_pLight != NULL); + ASSERT(m_pLight != nil); RwFrame *frame; static RwV3d Xaxis = { 1.0f, 0.0f, 0.0f }; static RwV3d Yaxis = { 0.0f, 1.0f, 0.0f }; frame = RpLightGetFrame(m_pLight); - ASSERT(frame != NULL); + ASSERT(frame != nil); if ( !frame ) - return NULL; + return nil; RwFrameRotate(frame, &Yaxis, angleY, rwCOMBINEREPLACE); RwFrameRotate(frame, &Xaxis, angleX, rwCOMBINEPOSTCONCAT); @@ -161,7 +161,7 @@ CCutsceneShadow::SetLightProperties(float angleY, float angleX, bool setLight) bool CCutsceneShadow::IsInitialized() { - return m_pObject != NULL; + return m_pObject != nil; } void @@ -172,17 +172,17 @@ CCutsceneShadow::Destroy() m_BlurCamera.Destroy(); m_GradientCamera.Destroy(); - m_pAtomic = NULL; + m_pAtomic = nil; m_nRwObjectType = -1; if (m_pLight) { RwFrame *frame = RpLightGetFrame(m_pLight); - RpLightSetFrame(m_pLight, NULL); + RpLightSetFrame(m_pLight, nil); RwFrameDestroy(frame); RpLightDestroy(m_pLight); - m_pLight = NULL; + m_pLight = nil; } } @@ -192,12 +192,12 @@ CCutsceneShadow::Update() switch ( m_nRwObjectType ) { case rpCLUMP: - ASSERT(m_pClump != NULL); + ASSERT(m_pClump != nil); RwV3dTransformPoints(&m_BaseSphere.center, &m_BoundingSphere.center, 1, RwFrameGetMatrix(RpClumpGetFrame(m_pClump))); break; case rpATOMIC: - ASSERT(m_pAtomic != NULL); + ASSERT(m_pAtomic != nil); RwV3dTransformPoints(&m_BaseSphere.center, &m_BoundingSphere.center, 1, RwFrameGetMatrix(RpAtomicGetFrame(m_pAtomic))); break; } @@ -216,7 +216,7 @@ CCutsceneShadow::Update() } RwRaster *raster = m_Camera.GetRwRenderRaster(); - ASSERT(raster != NULL); + ASSERT(raster != nil); if ( m_bResample ) return m_ResampleCamera.RasterResample(raster); -- cgit v1.2.3 From 89fd7759a39b696865ff2fb22db808a219353507 Mon Sep 17 00:00:00 2001 From: Fire-Head Date: Tue, 4 Aug 2020 16:24:59 +0300 Subject: fixes --- src/render/CutsceneShadow.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/render/CutsceneShadow.cpp') diff --git a/src/render/CutsceneShadow.cpp b/src/render/CutsceneShadow.cpp index eeaebbc5..8cb33896 100644 --- a/src/render/CutsceneShadow.cpp +++ b/src/render/CutsceneShadow.cpp @@ -242,9 +242,9 @@ CCutsceneShadow::GetShadowCamera(int32 camType) { switch ( camType ) { - case RESAMPLE: return &m_ResampleCamera; break; - case BLUR: return &m_BlurCamera; break; - case GRADIENT: return &m_GradientCamera; break; + case RESAMPLE: return &m_ResampleCamera; + case BLUR: return &m_BlurCamera; + case GRADIENT: return &m_GradientCamera; } return &m_Camera; -- cgit v1.2.3