refactor render pipeline;
optimize emitters; serialize alpharef;
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
This file contains changelog of wiArchive versions
|
||||
|
||||
4: serialized Material property alphaRef
|
||||
3: serialized Material property parallaxOcclusionMapping
|
||||
2: serialized Material property planar_reflections
|
||||
1: Refactor Archive
|
||||
|
||||
@@ -84,7 +84,7 @@ void Renderable3DComponent::Initialize()
|
||||
wiRenderer::GetDevice()->GetScreenWidth()
|
||||
, wiRenderer::GetDevice()->GetScreenHeight()
|
||||
, false, FORMAT_R8G8B8A8_SNORM);
|
||||
rtTransparent.Initialize(
|
||||
rtSceneCopy.Initialize(
|
||||
wiRenderer::GetDevice()->GetScreenWidth(), wiRenderer::GetDevice()->GetScreenHeight()
|
||||
, false, FORMAT_R16G16B16A16_FLOAT,1,getMSAASampleCount());
|
||||
rtVolumeLight.Initialize(
|
||||
@@ -238,6 +238,9 @@ void Renderable3DComponent::RenderShadows(GRAPHICSTHREAD threadID)
|
||||
}
|
||||
void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID)
|
||||
{
|
||||
wiImageEffects fx((float)wiRenderer::GetDevice()->GetScreenWidth(), (float)wiRenderer::GetDevice()->GetScreenHeight());
|
||||
|
||||
|
||||
wiRenderer::UpdateCameraCB(wiRenderer::getCamera(), threadID);
|
||||
|
||||
if (getStereogramEnabled())
|
||||
@@ -273,16 +276,22 @@ void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRende
|
||||
wiRenderer::DrawWaterRipples(threadID);
|
||||
}
|
||||
|
||||
wiRenderer::GetDevice()->UnBindResources(TEXSLOT_ONDEMAND0, TEXSLOT_ONDEMAND_COUNT, threadID);
|
||||
RenderTransparentScene(mainRT, shadedSceneRT, threadID);
|
||||
}
|
||||
void Renderable3DComponent::RenderTransparentScene(wiRenderTarget& mainRT, wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID)
|
||||
{
|
||||
rtTransparent.Activate(threadID, mainRT.depth); {
|
||||
wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_FORWARD, shadedSceneRT.GetTexture(), rtReflection.GetTexture()
|
||||
, rtWaterRipple.GetTexture(), threadID, false);
|
||||
wiRenderer::DrawTrails(threadID, shadedSceneRT.GetTexture());
|
||||
rtSceneCopy.Activate(threadID, 0, 0, 0, 0); {
|
||||
fx.blendFlag = BLENDMODE_OPAQUE;
|
||||
fx.presentFullScreen = true;
|
||||
wiImage::Draw(shadedSceneRT.GetTexture(), fx, threadID);
|
||||
}
|
||||
|
||||
wiRenderer::GetDevice()->UnBindResources(TEXSLOT_ONDEMAND0, TEXSLOT_ONDEMAND_COUNT, threadID);
|
||||
shadedSceneRT.Set(threadID, mainRT.depth); {
|
||||
RenderTransparentScene(rtSceneCopy, threadID);
|
||||
wiRenderer::DrawTrails(threadID, rtSceneCopy.GetTexture());
|
||||
}
|
||||
}
|
||||
void Renderable3DComponent::RenderTransparentScene(wiRenderTarget& refractionRT, GRAPHICSTHREAD threadID)
|
||||
{
|
||||
wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_FORWARD, refractionRT.GetTexture(), rtReflection.GetTexture()
|
||||
, rtWaterRipple.GetTexture(), threadID, false);
|
||||
}
|
||||
void Renderable3DComponent::RenderBloom(GRAPHICSTHREAD threadID)
|
||||
{
|
||||
@@ -377,7 +386,6 @@ void Renderable3DComponent::RenderComposition1(wiRenderTarget& shadedSceneRT, GR
|
||||
|
||||
|
||||
fx.blendFlag = BLENDMODE_ALPHA;
|
||||
wiImage::Draw(rtTransparent.GetTexture(), fx, threadID);
|
||||
if (getEmittedParticlesEnabled()){
|
||||
wiImage::Draw(rtParticle.GetTexture(), fx, threadID);
|
||||
}
|
||||
@@ -396,7 +404,8 @@ void Renderable3DComponent::RenderComposition1(wiRenderTarget& shadedSceneRT, GR
|
||||
wiImage::Draw(rtLensFlare.GetTexture(), fx, threadID);
|
||||
}
|
||||
}
|
||||
void Renderable3DComponent::RenderComposition2(wiRenderTarget& mainRT, GRAPHICSTHREAD threadID){
|
||||
void Renderable3DComponent::RenderComposition2(wiRenderTarget& mainRT, GRAPHICSTHREAD threadID)
|
||||
{
|
||||
if (getStereogramEnabled())
|
||||
{
|
||||
// We don't need the following for stereograms...
|
||||
|
||||
@@ -52,6 +52,7 @@ protected:
|
||||
, rtSSR
|
||||
, rtMotionBlur
|
||||
, rtVolumeLight
|
||||
, rtSceneCopy
|
||||
, rtTransparent
|
||||
, rtWaterRipple
|
||||
, rtLinearDepth
|
||||
@@ -71,7 +72,7 @@ protected:
|
||||
virtual void RenderShadows(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE);
|
||||
virtual void RenderScene(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0;
|
||||
virtual void RenderSecondaryScene(wiRenderTarget& mainRT, wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE);
|
||||
virtual void RenderTransparentScene(wiRenderTarget& mainRT, wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE);
|
||||
virtual void RenderTransparentScene(wiRenderTarget& refractionRT, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE);
|
||||
virtual void RenderBloom(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE);
|
||||
virtual void RenderLightShafts(wiRenderTarget& mainRT, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE);
|
||||
virtual void RenderComposition1(wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE);
|
||||
|
||||
@@ -52,13 +52,9 @@ void TiledForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID)
|
||||
wiRenderer::DrawSky(threadID);
|
||||
}
|
||||
}
|
||||
void TiledForwardRenderableComponent::RenderTransparentScene(wiRenderTarget& mainRT, wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID)
|
||||
void TiledForwardRenderableComponent::RenderTransparentScene(wiRenderTarget& refractionRT, GRAPHICSTHREAD threadID)
|
||||
{
|
||||
rtTransparent.Activate(threadID, mainRT.depth);
|
||||
{
|
||||
wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_TILEDFORWARD, shadedSceneRT.GetTexture(), rtReflection.GetTexture()
|
||||
, rtWaterRipple.GetTexture(), threadID, getHairParticleAlphaCompositionEnabled());
|
||||
wiRenderer::DrawTrails(threadID, shadedSceneRT.GetTexture());
|
||||
}
|
||||
wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_TILEDFORWARD, refractionRT.GetTexture(), rtReflection.GetTexture()
|
||||
, rtWaterRipple.GetTexture(), threadID, getHairParticleAlphaCompositionEnabled());
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ class TiledForwardRenderableComponent :
|
||||
{
|
||||
private:
|
||||
virtual void RenderScene(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override;
|
||||
virtual void RenderTransparentScene(wiRenderTarget& mainRT, wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override;
|
||||
virtual void RenderTransparentScene(wiRenderTarget& refractionRT, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override;
|
||||
public:
|
||||
TiledForwardRenderableComponent();
|
||||
virtual ~TiledForwardRenderableComponent();
|
||||
|
||||
@@ -19,7 +19,7 @@ struct VertextoPixel
|
||||
{
|
||||
float4 pos : SV_POSITION;
|
||||
float2 tex : TEXCOORD0;
|
||||
float4 opaAddDarkSiz : TEXCOORD1;
|
||||
nointerpolation float4 opaAddDarkSiz : TEXCOORD1;
|
||||
//float3 col : TEXCOORD2;
|
||||
float4 pp : TEXCOORD2;
|
||||
};
|
||||
|
||||
@@ -5,7 +5,7 @@ struct VertextoPixel
|
||||
{
|
||||
float4 pos : SV_POSITION;
|
||||
float2 tex : TEXCOORD0;
|
||||
float4 opaAddDarkSiz : TEXCOORD1;
|
||||
nointerpolation float4 opaAddDarkSiz : TEXCOORD1;
|
||||
//float3 col : TEXCOORD2;
|
||||
float4 pp : TEXCOORD2;
|
||||
};
|
||||
@@ -22,18 +22,14 @@ float4 main(VertextoPixel PSIn) : SV_TARGET
|
||||
float4 color = float4(0,0,0,0);
|
||||
color=texture_0.Sample(sampler_linear_clamp,PSIn.tex);
|
||||
|
||||
[branch]if(PSIn.opaAddDarkSiz.z){
|
||||
[branch]
|
||||
if(PSIn.opaAddDarkSiz.z)
|
||||
{
|
||||
color.rgb=float3(0,0,0);
|
||||
}
|
||||
else{
|
||||
[branch]if(PSIn.opaAddDarkSiz.y){
|
||||
color.rgba-=PSIn.opaAddDarkSiz.x;
|
||||
color.rgba*=fade;
|
||||
}
|
||||
else{
|
||||
color.a-=PSIn.opaAddDarkSiz.x;
|
||||
color.a*=fade;
|
||||
}
|
||||
color.a-=PSIn.opaAddDarkSiz.x;
|
||||
color.a*=fade;
|
||||
}
|
||||
|
||||
//color.rgb*=PSIn.col.rgb;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#include "wiHelper.h"
|
||||
|
||||
// this should always be only INCREMENTED and only if a new serialization is implemeted somewhere!
|
||||
uint64_t __archiveVersion = 3;
|
||||
uint64_t __archiveVersion = 4;
|
||||
// this is the version number of which below the archive is not compatible with the current version
|
||||
uint64_t __archiveVersionBarrier = 1;
|
||||
|
||||
|
||||
@@ -61,7 +61,6 @@ wiEmittedParticle::wiEmittedParticle(std::string newName, std::string newMat, Ob
|
||||
rotation = newRot;
|
||||
|
||||
bounding_box=new AABB();
|
||||
lastSquaredDistMulThousand=0;
|
||||
light=nullptr;
|
||||
CreateLight();
|
||||
|
||||
@@ -294,63 +293,64 @@ void wiEmittedParticle::Burst(float num)
|
||||
burst-=(int)burst;
|
||||
}
|
||||
|
||||
|
||||
void wiEmittedParticle::Draw(Camera* camera, GRAPHICSTHREAD threadID, int FLAG)
|
||||
void wiEmittedParticle::UpdateRenderData(GRAPHICSTHREAD threadID)
|
||||
{
|
||||
if(!points.empty()){
|
||||
|
||||
|
||||
if(camera->frustum.CheckBox(bounding_box->corners))
|
||||
{
|
||||
GraphicsDevice* device = wiRenderer::GetDevice();
|
||||
device->EventBegin(L"EmittedParticle", threadID);
|
||||
|
||||
vector<Point> renderPoints=vector<Point>(points.begin(),points.end());
|
||||
device->UpdateBuffer(vertexBuffer, renderPoints.data(), threadID, (int)(sizeof(Point)* renderPoints.size()));
|
||||
|
||||
bool additive = (material->blendFlag==BLENDMODE_ADDITIVE || material->premultipliedTexture);
|
||||
|
||||
device->BindPrimitiveTopology(PRIMITIVETOPOLOGY::POINTLIST,threadID);
|
||||
device->BindVertexLayout(vertexLayout,threadID);
|
||||
device->BindPS(wireRender?simplestPS:pixelShader,threadID);
|
||||
device->BindVS(vertexShader,threadID);
|
||||
device->BindGS(geometryShader,threadID);
|
||||
|
||||
//device->BindResourcePS(depth,1,threadID);
|
||||
|
||||
ConstantBuffer cb;
|
||||
cb.mAdd.x = additive;
|
||||
cb.mAdd.y = (FLAG==DRAW_DARK?true:false);
|
||||
cb.mMotionBlurAmount = motionBlurAmount;
|
||||
|
||||
|
||||
device->UpdateBuffer(constantBuffer,&cb,threadID);
|
||||
device->BindConstantBufferGS(constantBuffer, CB_GETBINDSLOT(ConstantBuffer),threadID);
|
||||
|
||||
device->BindRasterizerState(wireRender?wireFrameRS:rasterizerState,threadID);
|
||||
device->BindDepthStencilState(depthStencilState,1,threadID);
|
||||
|
||||
device->BindBlendState((additive?blendStateAdd:blendStateAlpha),threadID);
|
||||
|
||||
device->BindVertexBuffer(vertexBuffer,0,sizeof(Point),threadID);
|
||||
|
||||
if(!wireRender && material->texture)
|
||||
device->BindResourcePS(material->texture,TEXSLOT_ONDEMAND0,threadID);
|
||||
device->Draw((int)renderPoints.size(),threadID);
|
||||
|
||||
|
||||
device->BindGS(nullptr,threadID);
|
||||
device->EventEnd(threadID);
|
||||
}
|
||||
if (!points.empty())
|
||||
{
|
||||
vector<Point> renderPoints = vector<Point>(points.begin(), points.end());
|
||||
wiRenderer::GetDevice()->UpdateBuffer(vertexBuffer, renderPoints.data(), threadID, (int)(sizeof(Point)* renderPoints.size()));
|
||||
}
|
||||
}
|
||||
void wiEmittedParticle::DrawPremul(Camera* camera, GRAPHICSTHREAD threadID, int FLAG){
|
||||
if(material->premultipliedTexture)
|
||||
Draw(camera,threadID,FLAG);
|
||||
|
||||
void wiEmittedParticle::Draw(GRAPHICSTHREAD threadID, int FLAG)
|
||||
{
|
||||
if(!points.empty())
|
||||
{
|
||||
GraphicsDevice* device = wiRenderer::GetDevice();
|
||||
device->EventBegin(L"EmittedParticle", threadID);
|
||||
|
||||
bool additive = (material->blendFlag==BLENDMODE_ADDITIVE || material->premultipliedTexture);
|
||||
|
||||
device->BindPrimitiveTopology(PRIMITIVETOPOLOGY::POINTLIST,threadID);
|
||||
device->BindVertexLayout(vertexLayout,threadID);
|
||||
device->BindPS(wireRender?simplestPS:pixelShader,threadID);
|
||||
device->BindVS(vertexShader,threadID);
|
||||
device->BindGS(geometryShader,threadID);
|
||||
|
||||
//device->BindResourcePS(depth,1,threadID);
|
||||
|
||||
ConstantBuffer cb;
|
||||
cb.mAdd.x = additive;
|
||||
cb.mAdd.y = (FLAG==DRAW_DARK?true:false);
|
||||
cb.mMotionBlurAmount = motionBlurAmount;
|
||||
|
||||
|
||||
device->UpdateBuffer(constantBuffer,&cb,threadID);
|
||||
device->BindConstantBufferGS(constantBuffer, CB_GETBINDSLOT(ConstantBuffer),threadID);
|
||||
|
||||
device->BindRasterizerState(wireRender?wireFrameRS:rasterizerState,threadID);
|
||||
device->BindDepthStencilState(depthStencilState,1,threadID);
|
||||
|
||||
device->BindBlendState((additive?blendStateAdd:blendStateAlpha),threadID);
|
||||
|
||||
device->BindVertexBuffer(vertexBuffer,0,sizeof(Point),threadID);
|
||||
|
||||
if(!wireRender && material->texture)
|
||||
device->BindResourcePS(material->texture,TEXSLOT_ONDEMAND0,threadID);
|
||||
device->Draw((int)points.size(),threadID);
|
||||
|
||||
|
||||
device->BindGS(nullptr,threadID);
|
||||
device->EventEnd(threadID);
|
||||
}
|
||||
}
|
||||
void wiEmittedParticle::DrawNonPremul(Camera* camera, GRAPHICSTHREAD threadID, int FLAG){
|
||||
void wiEmittedParticle::DrawPremul(GRAPHICSTHREAD threadID, int FLAG){
|
||||
if(material->premultipliedTexture)
|
||||
Draw(threadID,FLAG);
|
||||
}
|
||||
void wiEmittedParticle::DrawNonPremul(GRAPHICSTHREAD threadID, int FLAG){
|
||||
if(!material->premultipliedTexture)
|
||||
Draw(camera,threadID,FLAG);
|
||||
Draw(threadID,FLAG);
|
||||
}
|
||||
|
||||
|
||||
@@ -483,20 +483,20 @@ void wiEmittedParticle::SetUpStates()
|
||||
bd.RenderTarget[0].DestBlendAlpha = BLEND_INV_SRC_ALPHA;
|
||||
bd.RenderTarget[0].BlendOpAlpha = BLEND_OP_ADD;
|
||||
bd.RenderTarget[0].RenderTargetWriteMask = 0x0f;
|
||||
bd.IndependentBlendEnable=true;
|
||||
bd.IndependentBlendEnable=false;
|
||||
blendStateAlpha = new BlendState;
|
||||
wiRenderer::GetDevice()->CreateBlendState(&bd,blendStateAlpha);
|
||||
|
||||
ZeroMemory(&bd, sizeof(bd));
|
||||
bd.RenderTarget[0].BlendEnable=true;
|
||||
bd.RenderTarget[0].SrcBlend = BLEND_ONE;
|
||||
bd.RenderTarget[0].SrcBlend = BLEND_SRC_ALPHA;
|
||||
bd.RenderTarget[0].DestBlend = BLEND_ONE;
|
||||
bd.RenderTarget[0].BlendOp = BLEND_OP_ADD;
|
||||
bd.RenderTarget[0].SrcBlendAlpha = BLEND_ONE;
|
||||
bd.RenderTarget[0].DestBlendAlpha = BLEND_ONE;
|
||||
bd.RenderTarget[0].SrcBlendAlpha = BLEND_SRC_ALPHA;
|
||||
bd.RenderTarget[0].DestBlendAlpha = BLEND_INV_SRC_ALPHA;
|
||||
bd.RenderTarget[0].BlendOpAlpha = BLEND_OP_ADD;
|
||||
bd.RenderTarget[0].RenderTargetWriteMask = 0x0f;
|
||||
bd.IndependentBlendEnable=true;
|
||||
bd.RenderTarget[0].RenderTargetWriteMask = COLOR_WRITE_ENABLE_ALL;
|
||||
bd.IndependentBlendEnable=false;
|
||||
blendStateAdd = new BlendState;
|
||||
wiRenderer::GetDevice()->CreateBlendState(&bd,blendStateAdd);
|
||||
}
|
||||
|
||||
@@ -104,11 +104,13 @@ public:
|
||||
void Update(float gamespeed);
|
||||
void Burst(float num);
|
||||
|
||||
void UpdateRenderData(GRAPHICSTHREAD threadID);
|
||||
|
||||
#define DRAW_DEFAULT 0
|
||||
#define DRAW_DARK 1
|
||||
void Draw(Camera* camera, GRAPHICSTHREAD threadID, int FLAG = DRAW_DEFAULT);
|
||||
void DrawPremul(Camera* camera, GRAPHICSTHREAD threadID, int FLAG = DRAW_DEFAULT);
|
||||
void DrawNonPremul(Camera* camera, GRAPHICSTHREAD threadID, int FLAG = DRAW_DEFAULT);
|
||||
void Draw(GRAPHICSTHREAD threadID, int FLAG = DRAW_DEFAULT);
|
||||
void DrawPremul(GRAPHICSTHREAD threadID, int FLAG = DRAW_DEFAULT);
|
||||
void DrawNonPremul(GRAPHICSTHREAD threadID, int FLAG = DRAW_DEFAULT);
|
||||
void CleanUp();
|
||||
|
||||
string name;
|
||||
@@ -119,7 +121,6 @@ public:
|
||||
string lightName;
|
||||
|
||||
AABB* bounding_box;
|
||||
long lastSquaredDistMulThousand;
|
||||
|
||||
float size,random_factor,normal_factor;
|
||||
float count,life,random_life;
|
||||
|
||||
@@ -1520,6 +1520,10 @@ void Material::Serialize(wiArchive& archive)
|
||||
{
|
||||
archive >> parallaxOcclusionMapping;
|
||||
}
|
||||
if (archive.GetVersion() >= 4)
|
||||
{
|
||||
archive >> alphaRef;
|
||||
}
|
||||
|
||||
string texturesDir = archive.GetSourceDirectory() + "textures/";
|
||||
if (!refMapName.empty())
|
||||
@@ -1580,6 +1584,10 @@ void Material::Serialize(wiArchive& archive)
|
||||
{
|
||||
archive << parallaxOcclusionMapping;
|
||||
}
|
||||
if (archive.GetVersion() >= 4)
|
||||
{
|
||||
archive << alphaRef;
|
||||
}
|
||||
}
|
||||
}
|
||||
#pragma endregion
|
||||
|
||||
+34
-18
@@ -1448,6 +1448,7 @@ void wiRenderer::UpdatePerFrameData()
|
||||
culling.culledHairParticleSystems.clear();
|
||||
culling.culledLights.clear();
|
||||
culling.culledLight_count = 0;
|
||||
culling.culledEmittedParticleSystems.clear();
|
||||
|
||||
if (spTree != nullptr)
|
||||
{
|
||||
@@ -1534,6 +1535,16 @@ void wiRenderer::UpdatePerFrameData()
|
||||
i++;
|
||||
}
|
||||
}
|
||||
for (auto& x : emitterSystems)
|
||||
{
|
||||
if (camera->frustum.CheckBox(x->bounding_box->corners))
|
||||
{
|
||||
culling.culledEmittedParticleSystems.push_back(x);
|
||||
}
|
||||
}
|
||||
std::sort(culling.culledEmittedParticleSystems.begin(), culling.culledEmittedParticleSystems.end(), [&](const wiEmittedParticle* a, const wiEmittedParticle* b) {
|
||||
return wiMath::DistanceSquared(camera->translation, a->bounding_box->getCenter()) > wiMath::DistanceSquared(camera->translation,b->bounding_box->getCenter());
|
||||
});
|
||||
}
|
||||
}
|
||||
refCam->Reflect(cam, waterPlane.getXMFLOAT4());
|
||||
@@ -1666,11 +1677,13 @@ void wiRenderer::UpdateRenderData(GRAPHICSTHREAD threadID)
|
||||
GetDevice()->BindResourcePS(envMaps[0], TEXSLOT_ENV0, threadID);
|
||||
GetDevice()->BindResourcePS(envMaps[1], TEXSLOT_ENV1, threadID);
|
||||
}
|
||||
|
||||
|
||||
const FrameCulling& mainCameraCulling = frameCullings[getCamera()];
|
||||
|
||||
// Fill Light Array with lights in the frustum
|
||||
{
|
||||
const FrameCulling& culling = frameCullings[getCamera()];
|
||||
const CulledList& culledLights = culling.culledLights;
|
||||
const CulledList& culledLights = mainCameraCulling.culledLights;
|
||||
|
||||
static LightArrayType* lightArray = (LightArrayType*)_mm_malloc(sizeof(LightArrayType)*MAX_LIGHTS, 16);
|
||||
ZeroMemory(lightArray, sizeof(lightArray));
|
||||
@@ -1734,6 +1747,12 @@ void wiRenderer::UpdateRenderData(GRAPHICSTHREAD threadID)
|
||||
GetDevice()->UpdateBuffer(resourceBuffers[RBTYPE_LIGHTARRAY], lightArray, threadID, (int)(sizeof(LightArrayType)*lightCounter));
|
||||
}
|
||||
|
||||
// Update visible particlesystem vertices:
|
||||
for (auto& x : mainCameraCulling.culledEmittedParticleSystems)
|
||||
{
|
||||
x->UpdateRenderData(threadID);
|
||||
}
|
||||
|
||||
}
|
||||
void wiRenderer::UpdateImages(){
|
||||
for (wiSprite* x : images)
|
||||
@@ -2140,27 +2159,20 @@ void wiRenderer::DrawDebugGridHelper(Camera* camera, GRAPHICSTHREAD threadID)
|
||||
|
||||
void wiRenderer::DrawSoftParticles(Camera* camera, GRAPHICSTHREAD threadID, bool dark)
|
||||
{
|
||||
struct particlesystem_comparator {
|
||||
bool operator() (const wiEmittedParticle* a, const wiEmittedParticle* b) const{
|
||||
return a->lastSquaredDistMulThousand>b->lastSquaredDistMulThousand;
|
||||
}
|
||||
};
|
||||
FrameCulling& culling = frameCullings[camera];
|
||||
|
||||
set<wiEmittedParticle*,particlesystem_comparator> psystems;
|
||||
for(wiEmittedParticle* e : emitterSystems){
|
||||
e->lastSquaredDistMulThousand=(long)(wiMath::DistanceSquared(e->bounding_box->getCenter(),camera->translation)*1000);
|
||||
psystems.insert(e);
|
||||
}
|
||||
|
||||
for(wiEmittedParticle* e:psystems){
|
||||
e->DrawNonPremul(camera,threadID,dark);
|
||||
for (wiEmittedParticle* e : culling.culledEmittedParticleSystems)
|
||||
{
|
||||
e->DrawNonPremul(threadID, dark);
|
||||
}
|
||||
}
|
||||
void wiRenderer::DrawSoftPremulParticles(Camera* camera, GRAPHICSTHREAD threadID, bool dark)
|
||||
{
|
||||
for (wiEmittedParticle* e : emitterSystems)
|
||||
FrameCulling& culling = frameCullings[camera];
|
||||
|
||||
for (wiEmittedParticle* e : culling.culledEmittedParticleSystems)
|
||||
{
|
||||
e->DrawPremul(camera, threadID, dark);
|
||||
e->DrawPremul(threadID, dark);
|
||||
}
|
||||
}
|
||||
void wiRenderer::DrawTrails(GRAPHICSTHREAD threadID, Texture2D* refracRes)
|
||||
@@ -2968,10 +2980,14 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle
|
||||
{
|
||||
GetDevice()->BindBlendState(blendStates[BSTYPE_COLORWRITEDISABLE], threadID);
|
||||
}
|
||||
else
|
||||
else if(renderTypeFlags & RENDERTYPE_OPAQUE)
|
||||
{
|
||||
GetDevice()->BindBlendState(blendStates[BSTYPE_OPAQUE], threadID);
|
||||
}
|
||||
else
|
||||
{
|
||||
GetDevice()->BindBlendState(blendStates[BSTYPE_TRANSPARENT], threadID);
|
||||
}
|
||||
|
||||
bool easyTextureBind = shaderType == SHADERTYPE_SHADOW || shaderType == SHADERTYPE_SHADOWCUBE || shaderType == SHADERTYPE_ALPHATESTONLY;
|
||||
|
||||
|
||||
@@ -362,6 +362,7 @@ public:
|
||||
vector<wiHairParticle*> culledHairParticleSystems;
|
||||
CulledList culledLights;
|
||||
UINT culledLight_count; // because forward_list doesn't have size()
|
||||
vector<wiEmittedParticle*> culledEmittedParticleSystems;
|
||||
};
|
||||
static unordered_map<Camera*, FrameCulling> frameCullings;
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace wiVersion
|
||||
// minor features, major updates
|
||||
const int minor = 9;
|
||||
// minor bug fixes, alterations, refactors, updates
|
||||
const int revision = 20;
|
||||
const int revision = 21;
|
||||
|
||||
|
||||
long GetVersion()
|
||||
|
||||
Reference in New Issue
Block a user