Changeset View
Changeset View
Standalone View
Standalone View
source/renderer/ParticleRenderer.cpp
Show First 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | |||||
void ParticleRenderer::Submit(int cullGroup, CParticleEmitter* emitter) | void ParticleRenderer::Submit(int cullGroup, CParticleEmitter* emitter) | ||||
{ | { | ||||
m->emitters[cullGroup].push_back(emitter); | m->emitters[cullGroup].push_back(emitter); | ||||
} | } | ||||
void ParticleRenderer::EndFrame() | void ParticleRenderer::EndFrame() | ||||
{ | { | ||||
for (int cullGroup = 0; cullGroup < CSceneRenderer::CULL_MAX; ++cullGroup) | for (std::vector<CParticleEmitter*>& cullGroupEmitters : m->emitters) | ||||
m->emitters[cullGroup].clear(); | cullGroupEmitters.clear(); | ||||
// this should leave the capacity unchanged, which is okay since it | // this should leave the capacity unchanged, which is okay since it | ||||
// won't be very large or very variable | // won't be very large or very variable | ||||
} | } | ||||
struct SortEmitterDistance | struct SortEmitterDistance | ||||
{ | { | ||||
SortEmitterDistance(const CMatrix3D& m) : worldToCam(m) { } | SortEmitterDistance(const CMatrix3D& m) : worldToCam(m) { } | ||||
Show All 27 Lines | if (!m->techWireframe) | ||||
m->techMultiply = g_Renderer.GetShaderManager().LoadEffect(str_particle_multiply, context); | m->techMultiply = g_Renderer.GetShaderManager().LoadEffect(str_particle_multiply, context); | ||||
CShaderDefines contextWithWireframe = context; | CShaderDefines contextWithWireframe = context; | ||||
contextWithWireframe.Add(str_MODE_WIREFRAME, str_1); | contextWithWireframe.Add(str_MODE_WIREFRAME, str_1); | ||||
m->techWireframe = g_Renderer.GetShaderManager().LoadEffect(str_particle_solid, contextWithWireframe); | m->techWireframe = g_Renderer.GetShaderManager().LoadEffect(str_particle_solid, contextWithWireframe); | ||||
} | } | ||||
++m->frameNumber; | ++m->frameNumber; | ||||
for (int cullGroup = 0; cullGroup < CSceneRenderer::CULL_MAX; ++cullGroup) | for (std::vector<CParticleEmitter*>& cullGroupEmitters : m->emitters) | ||||
{ | { | ||||
PROFILE("update emitters"); | PROFILE("update emitters"); | ||||
for (size_t i = 0; i < m->emitters[cullGroup].size(); ++i) | for (CParticleEmitter* emitter : cullGroupEmitters) | ||||
{ | { | ||||
CParticleEmitter* emitter = m->emitters[cullGroup][i]; | |||||
emitter->UpdateArrayData(m->frameNumber); | emitter->UpdateArrayData(m->frameNumber); | ||||
emitter->PrepareForRendering(); | emitter->PrepareForRendering(); | ||||
} | } | ||||
} | } | ||||
for (int cullGroup = 0; cullGroup < CSceneRenderer::CULL_MAX; ++cullGroup) | for (std::vector<CParticleEmitter*>& cullGroupEmitters : m->emitters) | ||||
{ | { | ||||
// Sort back-to-front by distance from camera | // Sort back-to-front by distance from camera | ||||
PROFILE("sort emitters"); | PROFILE("sort emitters"); | ||||
CMatrix3D worldToCam; | CMatrix3D worldToCam; | ||||
g_Renderer.GetSceneRenderer().GetViewCamera().GetOrientation().GetInverse(worldToCam); | g_Renderer.GetSceneRenderer().GetViewCamera().GetOrientation().GetInverse(worldToCam); | ||||
std::stable_sort(m->emitters[cullGroup].begin(), m->emitters[cullGroup].end(), SortEmitterDistance(worldToCam)); | std::stable_sort(cullGroupEmitters.begin(), cullGroupEmitters.end(), SortEmitterDistance(worldToCam)); | ||||
} | } | ||||
// TODO: should batch by texture here when possible, maybe | // TODO: should batch by texture here when possible, maybe | ||||
} | } | ||||
void ParticleRenderer::Upload( | |||||
Renderer::Backend::IDeviceCommandContext* deviceCommandContext) | |||||
{ | |||||
for (std::vector<CParticleEmitter*>& cullGroupEmitters : m->emitters) | |||||
phosit: range based for | |||||
Done Inline ActionsIt's enum, and we need to avoid the last element. vladislavbelov: It's enum, and we need to avoid the last element. | |||||
Done Inline ActionsBut you are iterating over the whole array phosit: But you are iterating over the whole array | |||||
Done Inline ActionscullGroup doesn't reach CSceneRenderer::CULL_MAX. vladislavbelov: `cullGroup` doesn't reach `CSceneRenderer::CULL_MAX`. | |||||
Done Inline ActionsCSceneRenderer::CULL_MAX is the size of the array: phosit: `CSceneRenderer::CULL_MAX` is the size of the array:
L40 `std::vector<CParticleEmitter*>… | |||||
Done Inline ActionsNow I see, yes, it makes sense. vladislavbelov: Now I see, yes, it makes sense. | |||||
for (CParticleEmitter* emitter : cullGroupEmitters) | |||||
emitter->UploadData(deviceCommandContext); | |||||
} | |||||
void ParticleRenderer::RenderParticles( | void ParticleRenderer::RenderParticles( | ||||
Renderer::Backend::IDeviceCommandContext* deviceCommandContext, | Renderer::Backend::IDeviceCommandContext* deviceCommandContext, | ||||
int cullGroup, bool wireframe) | int cullGroup, bool wireframe) | ||||
{ | { | ||||
CShaderTechnique* lastTech = nullptr; | CShaderTechnique* lastTech = nullptr; | ||||
for (CParticleEmitter* emitter : m->emitters[cullGroup]) | for (CParticleEmitter* emitter : m->emitters[cullGroup]) | ||||
{ | { | ||||
CShaderTechnique* currentTech = nullptr; | CShaderTechnique* currentTech = nullptr; | ||||
▲ Show 20 Lines • Show All 50 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator
range based for