diff --git a/WickedEngine/DeferredRenderableComponent.cpp b/WickedEngine/DeferredRenderableComponent.cpp index 1907cf445..0add0d0a7 100644 --- a/WickedEngine/DeferredRenderableComponent.cpp +++ b/WickedEngine/DeferredRenderableComponent.cpp @@ -90,7 +90,7 @@ void DeferredRenderableComponent::RenderScene(wiRenderer::DeviceContext context) wiRenderer::UpdatePerEffectCB(context, XMFLOAT4(0, 0, 0, 0), XMFLOAT4(0, 0, 0, 0)); wiRenderer::DrawWorld(wiRenderer::getCamera(), wiRenderer::DX11, tessellationQuality, context, false - , wiRenderer::SHADED_DEFERRED, rtReflection.shaderResource.front(), true, GRAPHICSTHREAD_SCENE); + , SHADERTYPE_DEFERRED, rtReflection.shaderResource.front(), true, GRAPHICSTHREAD_SCENE); wiRenderer::DrawSky(context); diff --git a/WickedEngine/ForwardRenderableComponent.cpp b/WickedEngine/ForwardRenderableComponent.cpp index a38602c88..970aa4771 100644 --- a/WickedEngine/ForwardRenderableComponent.cpp +++ b/WickedEngine/ForwardRenderableComponent.cpp @@ -75,7 +75,7 @@ void ForwardRenderableComponent::RenderScene(wiRenderer::DeviceContext context) wiRenderer::UpdatePerEffectCB(context, XMFLOAT4(0, 0, 0, 0), XMFLOAT4(0, 0, 0, 0)); wiRenderer::UpdatePerViewCB(context, wiRenderer::getCamera(), wiRenderer::getRefCamera()); wiRenderer::DrawWorld(wiRenderer::getCamera(), false, 0, context - , false, wiRenderer::SHADED_FORWARD_SIMPLE + , false, SHADERTYPE_FORWARD_SIMPLE , nullptr, true, GRAPHICSTHREAD_SCENE); wiRenderer::DrawSky(context); wiRenderer::DrawDebugBoneLines(wiRenderer::getCamera(), context); diff --git a/WickedEngine/MainComponent.cpp b/WickedEngine/MainComponent.cpp index 3ee9e3798..624400989 100644 --- a/WickedEngine/MainComponent.cpp +++ b/WickedEngine/MainComponent.cpp @@ -159,10 +159,6 @@ void MainComponent::Compose() { ss << "Resolution: " << wiRenderer::GetScreenWidth() << " x " << wiRenderer::GetScreenHeight() << endl; } - if (infoDisplay.renderResolution) - { - ss << "Render Res: " << wiRenderer::GetRenderWidth() << " x " << wiRenderer::GetRenderHeight() << endl; - } if (infoDisplay.fpsinfo) { ss.precision(2); diff --git a/WickedEngine/MainComponent.h b/WickedEngine/MainComponent.h index 10306f1a0..5b05c9e84 100644 --- a/WickedEngine/MainComponent.h +++ b/WickedEngine/MainComponent.h @@ -66,12 +66,12 @@ public: // display cpu utilization bool cpuinfo; // display resolution info - bool resolution, renderResolution; + bool resolution; // text size float size; InfoDisplayer() :active(false), watermark(true), fpsinfo(true), cpuinfo(true), - resolution(false), renderResolution(false), size(-7.f) + resolution(false), size(-7.f) {} }; // display all-time engine information text diff --git a/WickedEngine/MainComponent_BindLua.cpp b/WickedEngine/MainComponent_BindLua.cpp index 45a2dea86..a5131be4d 100644 --- a/WickedEngine/MainComponent_BindLua.cpp +++ b/WickedEngine/MainComponent_BindLua.cpp @@ -19,7 +19,6 @@ Luna::FunctionType MainComponent_BindLua::methods[] = { lunamethod(MainComponent_BindLua, SetFPSDisplay), lunamethod(MainComponent_BindLua, SetCPUDisplay), lunamethod(MainComponent_BindLua, SetResolutionDisplay), - lunamethod(MainComponent_BindLua, SetRenderResolutionDisplay), lunamethod(MainComponent_BindLua, SetColorGradePaletteDisplay), { NULL, NULL } }; @@ -285,22 +284,6 @@ int MainComponent_BindLua::SetResolutionDisplay(lua_State *L) wiLua::SError(L, "SetResolutionDisplay(bool active) not enough arguments!"); return 0; } -int MainComponent_BindLua::SetRenderResolutionDisplay(lua_State *L) -{ - if (component == nullptr) - { - wiLua::SError(L, "SetRenderResolutionDisplay() component is empty!"); - return 0; - } - int argc = wiLua::SGetArgCount(L); - if (argc > 0) - { - component->infoDisplay.renderResolution = wiLua::SGetBool(L, 1); - } - else - wiLua::SError(L, "SetRenderResolutionDisplay(bool active) not enough arguments!"); - return 0; -} int MainComponent_BindLua::SetColorGradePaletteDisplay(lua_State* L) { if (component == nullptr) diff --git a/WickedEngine/MainComponent_BindLua.h b/WickedEngine/MainComponent_BindLua.h index 3225cd145..dbc97b9dd 100644 --- a/WickedEngine/MainComponent_BindLua.h +++ b/WickedEngine/MainComponent_BindLua.h @@ -25,7 +25,6 @@ public: int SetFPSDisplay(lua_State *L); int SetCPUDisplay(lua_State *L); int SetResolutionDisplay(lua_State *L); - int SetRenderResolutionDisplay(lua_State *L); int SetColorGradePaletteDisplay(lua_State* L); static void Bind(); diff --git a/WickedEngine/Renderable3DComponent.cpp b/WickedEngine/Renderable3DComponent.cpp index bfbdf4045..f4f26bca4 100644 --- a/WickedEngine/Renderable3DComponent.cpp +++ b/WickedEngine/Renderable3DComponent.cpp @@ -77,10 +77,6 @@ void Renderable3DComponent::Initialize() (UINT)(wiRenderer::GetScreenWidth()*getAdditiveParticleDownSample()), (UINT)(wiRenderer::GetScreenHeight()*getAdditiveParticleDownSample()) , 1, false, 1, 0, DXGI_FORMAT_R16G16B16A16_FLOAT ); - rtWater.Initialize( - wiRenderer::GetScreenWidth(), wiRenderer::GetScreenHeight() - , 1, false, 1, 0, DXGI_FORMAT_R16G16B16A16_FLOAT - ); rtWaterRipple.Initialize( wiRenderer::GetScreenWidth() , wiRenderer::GetScreenHeight() @@ -224,7 +220,7 @@ void Renderable3DComponent::RenderReflections(wiRenderer::DeviceContext context) wiRenderer::UpdatePerViewCB(context, wiRenderer::getRefCamera(), wiRenderer::getCamera(), water); wiRenderer::DrawWorld(wiRenderer::getRefCamera(), false, 0, context - , false, wiRenderer::SHADED_NONE + , false, SHADERTYPE_NONE , nullptr, getHairParticlesReflectionEnabled(), GRAPHICSTHREAD_REFLECTIONS); wiRenderer::DrawSky(context); } @@ -244,7 +240,7 @@ void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRende { rtLensFlare.Activate(context); if (!wiRenderer::GetRasterizer()) - wiRenderer::DrawLensFlares(context, mainRT.depth->shaderResource, wiRenderer::GetScreenWidth(), wiRenderer::GetScreenHeight()); + wiRenderer::DrawLensFlares(context, mainRT.depth->shaderResource); } if (getVolumeLightsEnabled()) @@ -265,13 +261,10 @@ void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRende rtWaterRipple.Activate(context, 0, 0, 0, 0); { wiRenderer::DrawWaterRipples(context); } - rtWater.Activate(context, mainRT.depth); { - wiRenderer::DrawWorldWater(wiRenderer::getCamera(), shadedSceneRT.shaderResource.front(), rtReflection.shaderResource.front(), rtLinearDepth.shaderResource.back() - , rtWaterRipple.shaderResource.back(), context); - } rtTransparent.Activate(context, mainRT.depth); { - wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), shadedSceneRT.shaderResource.front(), rtReflection.shaderResource.front(), rtLinearDepth.shaderResource.back() + wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), shadedSceneRT.shaderResource.front(), rtReflection.shaderResource.front() + , rtWaterRipple.shaderResource.back(), rtLinearDepth.shaderResource.back() , context); wiRenderer::DrawTrails(context, shadedSceneRT.shaderResource.front()); } @@ -346,7 +339,6 @@ void Renderable3DComponent::RenderComposition1(wiRenderTarget& shadedSceneRT, wi fx.blendFlag = BLENDMODE_OPAQUE; wiImage::Draw(shadedSceneRT.shaderResource.front(), fx, context); fx.blendFlag = BLENDMODE_ALPHA; - wiImage::Draw(rtWater.shaderResource.back(), fx, context); wiImage::Draw(rtTransparent.shaderResource.back(), fx, context); if (getEmittedParticlesEnabled()){ wiImage::Draw(rtParticle.shaderResource.back(), fx, context); diff --git a/WickedEngine/Renderable3DComponent.h b/WickedEngine/Renderable3DComponent.h index 0a407feee..e3be362c6 100644 --- a/WickedEngine/Renderable3DComponent.h +++ b/WickedEngine/Renderable3DComponent.h @@ -50,7 +50,6 @@ protected: , rtMotionBlur , rtVolumeLight , rtTransparent - , rtWater , rtWaterRipple , rtLinearDepth , rtParticle diff --git a/WickedEngine/WickedEngine.h b/WickedEngine/WickedEngine.h index cb21ec192..15aff4d71 100644 --- a/WickedEngine/WickedEngine.h +++ b/WickedEngine/WickedEngine.h @@ -38,7 +38,7 @@ #include "wiWaterPlane.h" #include "wiPHYSICS.h" #include "wiBULLET.h" -#include "wiGraphicsThreads.h" +#include "wiEnums.h" #include "wiStencilRef.h" #include "wiInitializer.h" #include "wiLua.h" diff --git a/WickedEngine/WickedEngine.vcxproj b/WickedEngine/WickedEngine.vcxproj index 7da574675..962041d00 100644 --- a/WickedEngine/WickedEngine.vcxproj +++ b/WickedEngine/WickedEngine.vcxproj @@ -772,7 +772,7 @@ - + diff --git a/WickedEngine/WickedEngine.vcxproj.filters b/WickedEngine/WickedEngine.vcxproj.filters index 176fe5f6f..88ee2ff1a 100644 --- a/WickedEngine/WickedEngine.vcxproj.filters +++ b/WickedEngine/WickedEngine.vcxproj.filters @@ -1600,9 +1600,6 @@ Header Files - - Header Files - Header Files @@ -1786,6 +1783,9 @@ Header Files + + Header Files + diff --git a/WickedEngine/wiBackLog.cpp b/WickedEngine/wiBackLog.cpp index 45a30aee5..c7f9adcff 100644 --- a/WickedEngine/wiBackLog.cpp +++ b/WickedEngine/wiBackLog.cpp @@ -19,7 +19,7 @@ ID3D11ShaderResourceView* wiBackLog::backgroundTex = nullptr; wiFont wiBackLog::font; void wiBackLog::Initialize(){ - pos = (float)wiRenderer::RENDERHEIGHT; + pos = (float)wiRenderer::GetScreenHeight(); scroll=0; state=DISABLED; deletefromline=500; @@ -50,10 +50,10 @@ void wiBackLog::Update(){ pos+=speed; else if(state==ACTIVATING) pos-=speed; - if (pos >= wiRenderer::RENDERHEIGHT) + if (pos >= wiRenderer::GetScreenHeight()) { state = DISABLED; - pos = (float)wiRenderer::RENDERHEIGHT; + pos = (float)wiRenderer::GetScreenHeight(); } else if(pos<0) { @@ -64,12 +64,12 @@ void wiBackLog::Update(){ void wiBackLog::Draw(){ if(state!=DISABLED){ //wiImage::BatchBegin(); - wiImageEffects fx = wiImageEffects((float)wiRenderer::RENDERWIDTH, (float)wiRenderer::RENDERHEIGHT); + wiImageEffects fx = wiImageEffects((float)wiRenderer::GetScreenWidth(), (float)wiRenderer::GetScreenHeight()); fx.pos=XMFLOAT3(0,pos,0); - fx.opacity = wiMath::Lerp(1, 0, pos / wiRenderer::RENDERHEIGHT); + fx.opacity = wiMath::Lerp(1, 0, pos / wiRenderer::GetScreenHeight()); wiImage::Draw(backgroundTex, fx); font.SetText(getText()); - font.props.posY = pos - wiRenderer::RENDERHEIGHT + 75 + scroll; + font.props.posY = pos - wiRenderer::GetScreenHeight() + 75 + scroll; font.Draw(); wiFont(inputArea.str().c_str(), wiFontProps(5, -(float)wiRenderer::GetScreenHeight() + 10, 0, WIFALIGN_LEFT, WIFALIGN_BOTTOM, -8)).Draw(); //wiFont::Draw(wiBackLog::getText(), "01", XMFLOAT4(5, pos - wiRenderer::RENDERHEIGHT + 75 + scroll, 0, -8), "left", "bottom"); diff --git a/WickedEngine/wiEnums.h b/WickedEngine/wiEnums.h new file mode 100644 index 000000000..0521fac6f --- /dev/null +++ b/WickedEngine/wiEnums.h @@ -0,0 +1,34 @@ +#pragma once + +enum GRAPHICSTHREAD +{ + GRAPHICSTHREAD_REFLECTIONS, + GRAPHICSTHREAD_SCENE, + GRAPHICSTHREAD_MISC1, + GRAPHICSTHREAD_MISC2, + GRAPHICSTHREAD_MISC3, + GRAPHICSTHREAD_COUNT +}; + +// Do not alter order because it is bound to lua manually +enum RENDERTYPE +{ + RENDERTYPE_VOID = 0x0000000, + RENDERTYPE_OPAQUE = 0x0000001, + RENDERTYPE_TRANSPARENT = 0x0000010, + RENDERTYPE_WATER = 0x0000100, +}; +enum PICKTYPE +{ + PICK_VOID = RENDERTYPE_VOID, + PICK_OPAQUE = RENDERTYPE_OPAQUE, + PICK_TRANSPARENT = RENDERTYPE_TRANSPARENT, + PICK_WATER = RENDERTYPE_WATER, +}; + +enum SHADERTYPE +{ + SHADERTYPE_NONE, + SHADERTYPE_DEFERRED, + SHADERTYPE_FORWARD_SIMPLE, +}; \ No newline at end of file diff --git a/WickedEngine/wiFont.cpp b/WickedEngine/wiFont.cpp index 4351f0cfa..0e20afe4a 100644 --- a/WickedEngine/wiFont.cpp +++ b/WickedEngine/wiFont.cpp @@ -332,7 +332,7 @@ void wiFont::Draw(wiRenderer::DeviceContext context){ static thread_local ConstantBuffer* cb = new ConstantBuffer; (*cb).mProjection = XMMatrixTranspose( XMMatrixOrthographicLH((float)wiRenderer::GetScreenWidth(),(float)wiRenderer::GetScreenHeight(),0,100) ); (*cb).mTrans = XMMatrixTranspose(XMMatrixTranslation(newProps.posX, newProps.posY, 0)); - (*cb).mDimensions = XMFLOAT4((float)wiRenderer::RENDERWIDTH, (float)wiRenderer::RENDERHEIGHT, 0, 0); + (*cb).mDimensions = XMFLOAT4((float)wiRenderer::GetScreenWidth(), (float)wiRenderer::GetScreenHeight(), 0, 0); wiRenderer::UpdateBuffer(constantBuffer,cb,context); diff --git a/WickedEngine/wiGraphicsThreads.h b/WickedEngine/wiGraphicsThreads.h deleted file mode 100644 index 5a2a8dba9..000000000 --- a/WickedEngine/wiGraphicsThreads.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -enum GRAPHICSTHREAD -{ - GRAPHICSTHREAD_REFLECTIONS, - GRAPHICSTHREAD_SCENE, - GRAPHICSTHREAD_MISC1, - GRAPHICSTHREAD_MISC2, - GRAPHICSTHREAD_MISC3, - GRAPHICSTHREAD_COUNT -}; \ No newline at end of file diff --git a/WickedEngine/wiImage.cpp b/WickedEngine/wiImage.cpp index ab56236f1..749ff86a5 100644 --- a/WickedEngine/wiImage.cpp +++ b/WickedEngine/wiImage.cpp @@ -477,11 +477,11 @@ void wiImage::Draw(wiRenderer::TextureView texture, const wiImageEffects& effect static thread_local BlurBuffer* cb = new BlurBuffer; if(effects.blurDir==0){ wiRenderer::BindPS(blurHPS,context); - (*cb).mWeightTexelStrenMip.y = 1.0f / wiRenderer::GetRenderWidth(); + (*cb).mWeightTexelStrenMip.y = 1.0f / wiRenderer::GetScreenWidth(); } else{ wiRenderer::BindPS(blurVPS,context); - (*cb).mWeightTexelStrenMip.y = 1.0f / wiRenderer::GetRenderHeight(); + (*cb).mWeightTexelStrenMip.y = 1.0f / wiRenderer::GetScreenHeight(); } float weight0 = 1.0f; diff --git a/WickedEngine/wiLensFlare.cpp b/WickedEngine/wiLensFlare.cpp index 4c4425cee..f079da88d 100644 --- a/WickedEngine/wiLensFlare.cpp +++ b/WickedEngine/wiLensFlare.cpp @@ -47,8 +47,8 @@ void wiLensFlare::Draw(ID3D11ShaderResourceView* depthMap, ID3D11DeviceContext* wiRenderer::BindGS(geometryShader,context); static thread_local ConstantBuffer* cb = new ConstantBuffer; - (*cb).mSunPos = lightPos / XMVectorSet((float)wiRenderer::RENDERWIDTH, (float)wiRenderer::RENDERHEIGHT, 1, 1); - (*cb).mScreen = XMFLOAT4((float)wiRenderer::RENDERWIDTH, (float)wiRenderer::RENDERHEIGHT, 0, 0); + (*cb).mSunPos = lightPos / XMVectorSet((float)wiRenderer::GetScreenWidth(), (float)wiRenderer::GetScreenHeight(), 1, 1); + (*cb).mScreen = XMFLOAT4((float)wiRenderer::GetScreenWidth(), (float)wiRenderer::GetScreenHeight(), 0, 0); wiRenderer::UpdateBuffer(constantBuffer,cb,context); diff --git a/WickedEngine/wiLoader.cpp b/WickedEngine/wiLoader.cpp index de6490880..4d3db48ab 100644 --- a/WickedEngine/wiLoader.cpp +++ b/WickedEngine/wiLoader.cpp @@ -316,9 +316,6 @@ void Mesh::Optimize() void Mesh::CreateBuffers(){ if(!buffersComplete){ - //if(meshInstanceBuffer!=nullptr) - // return; - D3D11_BUFFER_DESC bd; if (meshInstanceBuffer == nullptr) { @@ -330,14 +327,6 @@ void Mesh::CreateBuffers(){ wiRenderer::graphicsDevice->CreateBuffer(&bd, 0, &meshInstanceBuffer); } - //bool armatureDeformedMesh=false; - //for(int u : usedBy){ - // if(objects[u]->armatureDeform) - // armatureDeformedMesh=true; - //} - //if(!armatureDeformedMesh) - // armature=nullptr; - if(goalVG>=0){ goalPositions.resize(vertexGroups[goalVG].vertices.size()); @@ -401,9 +390,9 @@ void Mesh::CreateBuffers(){ //PHYSICALMAPPING for (unsigned int i = 0; i(currentMat->name,currentMat)); } -void LoadWiObjects(const string& directory, const string& name, const string& identifier, vector& objects_norm - , vector& objects_trans, vector& objects_water, vector& armatures +void LoadWiObjects(const string& directory, const string& name, const string& identifier, vector& objects + , vector& armatures , MeshCollection& meshes, map& transforms, const MaterialCollection& materials) { - vector objects(0); int objectI=objects.size()-1; stringstream filename(""); @@ -861,8 +849,8 @@ void LoadWiObjects(const string& directory, const string& name, const string& id file>>systemName>>visibleEmitter>>materialName>>size>>randfac>>norfac>>count>>life>>randlife; file>>scaleX>>scaleY>>rot; - if(visibleEmitter) objects.back()->particleEmitter=Object::EMITTER_VISIBLE; - else if(objects.back()->particleEmitter==Object::NO_EMITTER) objects.back()->particleEmitter=Object::EMITTER_INVISIBLE; + if(visibleEmitter) objects.back()->emitterType=Object::EMITTER_VISIBLE; + else if(objects.back()->emitterType ==Object::NO_EMITTER) objects.back()->emitterType =Object::EMITTER_INVISIBLE; if(wiRenderer::EMITTERSENABLED){ stringstream identified_materialName(""); @@ -919,41 +907,6 @@ void LoadWiObjects(const string& directory, const string& name, const string& id bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; wiRenderer::graphicsDevice->CreateBuffer( &bd, NULL, &objects[i]->trailBuff ); } - - /*string parent = objects[i]->parent; - bool childofArmature=true; - if(parent.length()){ - for(int j=0;jname == parent){ - objects[j]->children.push_back(objects[i]->name); - objects[j]->childrenI.push_back(i); - childofArmature=false; - } - }*/ - - bool default_mesh = false; - bool water_mesh = false; - bool transparent_mesh = false; - - //if(objects[i]->mesh->renderable) - for(Material* mat : objects[i]->mesh->materials){ - if(!mat->water && !mat->isSky && !mat->IsTransparent()) - default_mesh=true; - if(mat->water && !mat->isSky) - water_mesh=true; - if(!mat->water && !mat->isSky && mat->IsTransparent()) - transparent_mesh=true; - } - - if(default_mesh) - objects_norm.push_back(objects[i]); - if(water_mesh) - objects_water.push_back(objects[i]); - if(transparent_mesh) - objects_trans.push_back(objects[i]); - - if(!default_mesh && !water_mesh && !transparent_mesh) - objects_norm.push_back(objects[i]); } } @@ -964,118 +917,6 @@ void LoadWiObjects(const string& directory, const string& name, const string& id iMesh->CreateBuffers(); } - //for(MeshCollection::iterator iter=meshes.begin(); iter!=meshes.end(); ++iter){ - // Mesh* iMesh = iter->second; - - // if(iMesh->buffersComplete) - // continue; - // - // for(int i=0;i<5;++i){ - // iMesh->instances[i].clear(); - // iMesh->instances[i].resize(iMesh->usedBy.size()); - // } - - // if(iMesh->meshInstanceBuffer!=nullptr) - // continue; - - // D3D11_BUFFER_DESC bd; - // ZeroMemory( &bd, sizeof(bd) ); - // bd.Usage = D3D11_USAGE_DYNAMIC; - // bd.ByteWidth = sizeof( Instance )*iMesh->usedBy.size(); - // bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; - // bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - // wiRenderer::graphicsDevice->CreateBuffer( &bd, 0, &iMesh->meshInstanceBuffer ); - - // bool armatureDeformedMesh=false; - // for(int u : iMesh->usedBy){ - // if(objects[u]->armatureDeform) - // armatureDeformedMesh=true; - // } - // if(!armatureDeformedMesh) - // iMesh->armature=nullptr; - - - // if(iMesh->goalVG>=0){ - // iMesh->goalPositions.resize(iMesh->vertexGroups[iMesh->goalVG].vertices.size()); - // iMesh->goalNormals.resize(iMesh->vertexGroups[iMesh->goalVG].vertices.size()); - // } - // iMesh->skinnedVertices.resize(iMesh->vertices.size()); - // for(int i=0;ivertices.size();++i){ - // iMesh->skinnedVertices[i].pos=iMesh->vertices[i].pos; - // iMesh->skinnedVertices[i].nor=iMesh->vertices[i].nor; - // iMesh->skinnedVertices[i].tex=iMesh->vertices[i].tex; - // } - - - // ZeroMemory( &bd, sizeof(bd) ); - //#ifdef USE_GPU_SKINNING - // bd.Usage = (iMesh->softBody?D3D11_USAGE_DYNAMIC:D3D11_USAGE_IMMUTABLE); - // bd.CPUAccessFlags = (iMesh->softBody?D3D11_CPU_ACCESS_WRITE:0); - // if(iMesh->hasArmature() && !iMesh->softBody) - // bd.ByteWidth = sizeof( SkinnedVertex ) * iMesh->vertices.size(); - // else - // bd.ByteWidth = sizeof( Vertex ) * iMesh->vertices.size(); - //#else - // bd.Usage = ((iMesh->softBody || iMesh->hasArmature())?D3D11_USAGE_DYNAMIC:D3D11_USAGE_IMMUTABLE); - // bd.CPUAccessFlags = ((iMesh->softBody || iMesh->hasArmature())?D3D11_CPU_ACCESS_WRITE:0); - // bd.ByteWidth = sizeof( Vertex ) * iMesh->vertices.size(); - //#endif - // bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; - // D3D11_SUBRESOURCE_DATA InitData; - // ZeroMemory( &InitData, sizeof(InitData) ); - // if(iMesh->hasArmature() && !iMesh->softBody) - // InitData.pSysMem = iMesh->vertices.data(); - // else - // InitData.pSysMem = iMesh->skinnedVertices.data(); - // wiRenderer::graphicsDevice->CreateBuffer( &bd, &InitData, &iMesh->meshVertBuff ); - // - // - // ZeroMemory( &bd, sizeof(bd) ); - // bd.Usage = D3D11_USAGE_IMMUTABLE; - // bd.ByteWidth = sizeof( unsigned int ) * iMesh->indices.size(); - // bd.BindFlags = D3D11_BIND_INDEX_BUFFER; - // bd.CPUAccessFlags = 0; - // ZeroMemory( &InitData, sizeof(InitData) ); - // InitData.pSysMem = iMesh->indices.data(); - // wiRenderer::graphicsDevice->CreateBuffer( &bd, &InitData, &iMesh->meshIndexBuff ); - // - // if(iMesh->renderable) - // { - // - // ZeroMemory( &bd, sizeof(bd) ); - // bd.Usage = D3D11_USAGE_DYNAMIC; - // bd.ByteWidth = sizeof(BoneShaderBuffer); - // bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - // bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - // wiRenderer::graphicsDevice->CreateBuffer( &bd, NULL, &iMesh->boneBuffer ); - - // if(iMesh->hasArmature() && !iMesh->softBody){ - // ZeroMemory( &bd, sizeof(bd) ); - // bd.Usage = D3D11_USAGE_DEFAULT; - // bd.ByteWidth = sizeof(Vertex) * iMesh->vertices.size(); - // bd.BindFlags = D3D11_BIND_STREAM_OUTPUT | D3D11_BIND_VERTEX_BUFFER; - // bd.CPUAccessFlags = 0; - // bd.StructureByteStride=0; - // wiRenderer::graphicsDevice->CreateBuffer( &bd, NULL, &iMesh->sOutBuffer ); - // } - - // //PHYSICALMAPPING - // for(int i=0;ivertices.size();++i){ - // for(int j=0;jphysicsverts.size();++j){ - // if( fabs( iMesh->vertices[i].pos.x-iMesh->physicsverts[j].x ) < DBL_EPSILON - // && fabs( iMesh->vertices[i].pos.y-iMesh->physicsverts[j].y ) < DBL_EPSILON - // && fabs( iMesh->vertices[i].pos.z-iMesh->physicsverts[j].z ) < DBL_EPSILON - // ) - // { - // iMesh->physicalmapGP.push_back(j); - // break; - // } - // } - // } - - // } - //} - objects.clear(); } void LoadWiMeshes(const string& directory, const string& name, const string& identifier, MeshCollection& meshes, const vector& armatures, const MaterialCollection& materials) { @@ -1803,28 +1644,25 @@ void LoadWiDecals(const string&directory, const string& name, const string& text void LoadFromDisk(const string& dir, const string& name, const string& identifier , vector& armatures , MaterialCollection& materials - , vector& objects_norm, vector& objects_trans, vector& objects_water + , vector& objects , MeshCollection& meshes , vector& lights , vector& spheres , WorldInfo& worldInfo, Wind& wind , vector& cameras - , vector& l_armatures - , vector& l_objects , map& transforms , list& decals ) { MaterialCollection l_materials; - vector l_objects_norm; - vector l_objects_trans; - vector l_objects_water; + vector l_armatures; + vector l_objects; MeshCollection l_meshes; vector l_lights; vector l_spheres; WorldInfo l_worldInfo = worldInfo; Wind l_wind = wind; - vector l_cameras; + vector l_cameras; map l_transforms; list l_decals; @@ -1847,7 +1685,7 @@ void LoadFromDisk(const string& dir, const string& name, const string& identifie LoadWiArmatures(directory.str(), armatureFilePath.str(),identifier,l_armatures,l_transforms); LoadWiMaterialLibrary(directory.str(), materialLibFilePath.str(),identifier, "textures/", l_materials); LoadWiMeshes(directory.str(), meshesFilePath.str(),identifier,meshes,l_armatures,l_materials); - LoadWiObjects(directory.str(), objectsFilePath.str(),identifier,l_objects_norm,l_objects_trans,l_objects_water,l_armatures,meshes,l_transforms,l_materials); + LoadWiObjects(directory.str(), objectsFilePath.str(),identifier,l_objects,l_armatures,meshes,l_transforms,l_materials); LoadWiActions(directory.str(), actionsFilePath.str(),identifier,l_armatures); LoadWiLights(directory.str(), lightsFilePath.str(),identifier, l_lights, l_armatures,l_transforms); LoadWiHitSpheres(directory.str(), hitSpheresFilePath.str(),identifier,spheres,l_armatures,l_transforms); @@ -1858,9 +1696,7 @@ void LoadFromDisk(const string& dir, const string& name, const string& identifie wiRenderer::graphicsMutex.lock(); { armatures.insert(armatures.end(),l_armatures.begin(),l_armatures.end()); - objects_norm.insert(objects_norm.end(),l_objects_norm.begin(),l_objects_norm.end()); - objects_trans.insert(objects_trans.end(),l_objects_trans.begin(),l_objects_trans.end()); - objects_water.insert(objects_water.end(),l_objects_water.begin(),l_objects_water.end()); + objects.insert(objects.end(),l_objects.begin(),l_objects.end()); lights.insert(lights.end(),l_lights.begin(),l_lights.end()); spheres.insert(spheres.end(),l_spheres.begin(),l_spheres.end()); cameras.insert(cameras.end(),l_cameras.begin(),l_cameras.end()); @@ -1870,10 +1706,6 @@ void LoadFromDisk(const string& dir, const string& name, const string& identifie worldInfo=l_worldInfo; wind=l_wind; - - l_objects.insert(l_objects.end(),l_objects_norm.begin(),l_objects_norm.end()); - l_objects.insert(l_objects.end(),l_objects_trans.begin(),l_objects_trans.end()); - l_objects.insert(l_objects.end(),l_objects_water.begin(),l_objects_water.end()); transforms.insert(l_transforms.begin(),l_transforms.end()); diff --git a/WickedEngine/wiLoader.h b/WickedEngine/wiLoader.h index 3f50d531f..e2538c707 100644 --- a/WickedEngine/wiLoader.h +++ b/WickedEngine/wiLoader.h @@ -4,7 +4,7 @@ #include "wiImageEffects.h" #include "wiRenderTarget.h" #include "wiDepthTarget.h" -#include "wiGraphicsThreads.h" +#include "wiEnums.h" #include "wiStencilRef.h" #include "wiMath.h" #include "wiFrustum.h" @@ -183,6 +183,15 @@ struct Material void CleanUp(); bool IsTransparent() { return alpha < 1.0f; } + bool IsWater() { return water; } + RENDERTYPE GetRenderType() + { + if (IsWater()) + return RENDERTYPE_WATER; + if (IsTransparent()) + return RENDERTYPE_TRANSPARENT; + return RENDERTYPE_OPAQUE; + } }; struct RibbonVertex { @@ -489,12 +498,12 @@ struct Object : public Streamable, public Transform bool armatureDeform; //PARTICLE - enum wiParticleEmitter{ + enum EmitterType{ NO_EMITTER, EMITTER_VISIBLE, EMITTER_INVISIBLE, }; - wiParticleEmitter particleEmitter; + EmitterType emitterType; vector< wiEmittedParticle* > eParticleSystems; vector< wiHairParticle* > hParticleSystems; @@ -529,7 +538,7 @@ struct Object : public Streamable, public Transform XMStoreFloat4x4( &worldPrev,XMMatrixIdentity() ); trail.resize(0); trailBuff=NULL; - particleEmitter = NO_EMITTER; + emitterType = NO_EMITTER; eParticleSystems.resize(0); hParticleSystems.resize(0); mesh=nullptr; @@ -549,6 +558,15 @@ struct Object : public Streamable, public Transform } void EmitTrail(const XMFLOAT3& color, float fadeSpeed = 0.06f); void FadeTrail(); + int GetRenderTypes() + { + int retVal = RENDERTYPE::RENDERTYPE_VOID; + for (Material* mat : mesh->materials) + { + retVal |= mat->GetRenderType(); + } + return retVal; + } }; struct KeyFrame { @@ -1122,8 +1140,8 @@ void RecursiveRest(Armature* armature, Bone* bone); void LoadWiArmatures(const string& directory, const string& filename, const string& identifier, vector& armatures , map& transforms); void LoadWiMaterialLibrary(const string& directory, const string& filename, const string& identifier, const string& texturesDir, MaterialCollection& materials); -void LoadWiObjects(const string& directory, const string& filename, const string& identifier, vector& objects_norm - , vector& objects_trans, vector& objects_water, vector& armatures, MeshCollection& meshes +void LoadWiObjects(const string& directory, const string& filename, const string& identifier, vector& objects + , vector& armatures, MeshCollection& meshes , map& transforms, const MaterialCollection& materials); void LoadWiMeshes(const string& directory, const string& filename, const string& identifier, MeshCollection& meshes, const vector& armatures, const MaterialCollection& materials); void LoadWiActions(const string& directory, const string& filename, const string& identifier, vector& armatures); @@ -1140,14 +1158,12 @@ void LoadWiDecals(const string&directory, const string& name, const string& text void LoadFromDisk(const string& dir, const string& name, const string& identifier , vector& armatures , MaterialCollection& materials - , vector& objects_norm, vector& objects_trans, vector& objects_water + , vector& objects , MeshCollection& meshes , vector& lights , vector& spheres , WorldInfo& worldInfo, Wind& wind , vector& cameras - , vector& l_armatures - , vector& l_objects , map& transforms , list& decals ); diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index bd5dba17d..60b8c354b 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -17,7 +17,7 @@ #include "wiLines.h" #include "wiCube.h" #include "wiWaterPlane.h" -#include "wiGraphicsThreads.h" +#include "wiEnums.h" #include "wiRandom.h" #include "wiFont.h" @@ -38,7 +38,7 @@ wiRenderer::Sampler wiRenderer::ssClampLin,wiRenderer::ssClampPoi,wiRenderer::ss map wiRenderer::drawCalls; -int wiRenderer::RENDERWIDTH=1280,wiRenderer::RENDERHEIGHT=720,wiRenderer::SCREENWIDTH=1280,wiRenderer::SCREENHEIGHT=720,wiRenderer::SHADOWMAPRES=1024,wiRenderer::SOFTSHADOW=2 +int wiRenderer::SCREENWIDTH=1280,wiRenderer::SCREENHEIGHT=720,wiRenderer::SHADOWMAPRES=1024,wiRenderer::SOFTSHADOW=2 ,wiRenderer::POINTLIGHTSHADOW=2,wiRenderer::POINTLIGHTSHADOWRES=256, wiRenderer::SPOTLIGHTSHADOW=2, wiRenderer::SPOTLIGHTSHADOWRES=512; bool wiRenderer::HAIRPARTICLEENABLED=true,wiRenderer::EMITTERSENABLED=true; bool wiRenderer::wireRender = false, wiRenderer::debugSpheres = false, wiRenderer::debugBoneLines = false, wiRenderer::debugBoxes = false; @@ -86,14 +86,9 @@ deque wiRenderer::images; deque wiRenderer::waterRipples; wiSPTree* wiRenderer::spTree; -wiSPTree* wiRenderer::spTree_trans; -wiSPTree* wiRenderer::spTree_water; wiSPTree* wiRenderer::spTree_lights; -vector wiRenderer::everyObject; vector wiRenderer::objects; -vector wiRenderer::objects_trans; -vector wiRenderer::objects_water; MeshCollection wiRenderer::meshes; MaterialCollection wiRenderer::materials; vector wiRenderer::armatures; @@ -637,31 +632,6 @@ void wiRenderer::CleanUpStaticTemp(){ objects[i]->hParticleSystems.clear(); } objects.clear(); - - for(unsigned int i=0;iCleanUp(); - for (unsigned int j = 0; jeParticleSystems.size(); ++j) - objects_trans[i]->eParticleSystems[j]->CleanUp(); - objects_trans[i]->eParticleSystems.clear(); - - for (unsigned int j = 0; jhParticleSystems.size(); ++j) - objects_trans[i]->hParticleSystems[j]->CleanUp(); - objects_trans[i]->hParticleSystems.clear(); - } - objects_trans.clear(); - - for (unsigned int i = 0; iCleanUp(); - for (unsigned int j = 0; jeParticleSystems.size(); ++j) - objects_water[i]->eParticleSystems[j]->CleanUp(); - objects_water[i]->eParticleSystems.clear(); - - for (unsigned int j = 0; jhParticleSystems.size(); ++j) - objects_water[i]->hParticleSystems[j]->CleanUp(); - objects_water[i]->hParticleSystems.clear(); - } - objects_water.clear(); - everyObject.clear(); for(MaterialCollection::iterator iter=materials.begin(); iter!=materials.end();++iter) iter->second->CleanUp(); @@ -680,14 +650,6 @@ void wiRenderer::CleanUpStaticTemp(){ if(spTree) spTree->CleanUp(); spTree = nullptr; - - if(spTree_trans) - spTree_trans->CleanUp(); - spTree_trans = nullptr; - - if(spTree_water) - spTree_water->CleanUp(); - spTree_water = nullptr; if(spTree_lights) @@ -812,8 +774,6 @@ void wiRenderer::UpdateCubes(){ }*/ cubes.clear(); if(spTree) iterateSPTree(spTree->root,cubes,XMFLOAT4A(1,1,0,1)); - if(spTree_trans) iterateSPTree(spTree_trans->root,cubes,XMFLOAT4A(0,1,1,1)); - if(spTree_water) iterateSPTree(spTree_water->root,cubes,XMFLOAT4A(0,0,1,1)); if(spTree_lights) iterateSPTree(spTree_lights->root,cubes,XMFLOAT4A(1,1,1,1)); } if(debugBoxes){ @@ -1678,20 +1638,6 @@ Object* wiRenderer::getObjectByName(const string& name) return x; } } - for (auto& x : objects_trans) - { - if (!x->name.compare(name)) - { - return x; - } - } - for (auto& x : objects_water) - { - if (!x->name.compare(name)) - { - return x; - } - } return nullptr; } @@ -2098,8 +2044,6 @@ void wiRenderer::UpdateRenderInfo(ID3D11DeviceContext* context) UpdateSPTree(spTree); - UpdateSPTree(spTree_trans); - UpdateSPTree(spTree_water); } UpdateBoneLines(); @@ -2108,37 +2052,37 @@ void wiRenderer::UpdateRenderInfo(ID3D11DeviceContext* context) wind.time = (float)((wiTimer::TotalTime()) / 1000.0*GameSpeed / 2.0*3.1415)*XMVectorGetX(XMVector3Length(XMLoadFloat3(&wind.direction)))*0.1f; } void wiRenderer::UpdateObjects(){ - for (unsigned int i = 0; igetTransform(); + XMMATRIX world = o->getTransform(); - if(everyObject[i]->mesh->isBillboarded){ + if(o->mesh->isBillboarded){ XMMATRIX bbMat = XMMatrixIdentity(); - if(everyObject[i]->mesh->billboardAxis.x || everyObject[i]->mesh->billboardAxis.y || everyObject[i]->mesh->billboardAxis.z){ + if(o->mesh->billboardAxis.x || o->mesh->billboardAxis.y || o->mesh->billboardAxis.z){ float angle = 0; - angle = (float)atan2(everyObject[i]->translation.x - wiRenderer::getCamera()->translation.x, everyObject[i]->translation.z - wiRenderer::getCamera()->translation.z) * (180.0f / XM_PI); - bbMat = XMMatrixRotationAxis(XMLoadFloat3(&everyObject[i]->mesh->billboardAxis), angle * 0.0174532925f ); + angle = (float)atan2(o->translation.x - wiRenderer::getCamera()->translation.x, o->translation.z - wiRenderer::getCamera()->translation.z) * (180.0f / XM_PI); + bbMat = XMMatrixRotationAxis(XMLoadFloat3(&o->mesh->billboardAxis), angle * 0.0174532925f ); } else - bbMat = XMMatrixInverse(0,XMMatrixLookAtLH(XMVectorSet(0,0,0,0),XMVectorSubtract(XMLoadFloat3(&everyObject[i]->translation),wiRenderer::getCamera()->GetEye()),XMVectorSet(0,1,0,0))); + bbMat = XMMatrixInverse(0,XMMatrixLookAtLH(XMVectorSet(0,0,0,0),XMVectorSubtract(XMLoadFloat3(&o->translation),wiRenderer::getCamera()->GetEye()),XMVectorSet(0,1,0,0))); - XMMATRIX w = XMMatrixScalingFromVector(XMLoadFloat3(&everyObject[i]->scale)) * + XMMATRIX w = XMMatrixScalingFromVector(XMLoadFloat3(&o->scale)) * bbMat * - XMMatrixRotationQuaternion(XMLoadFloat4(&everyObject[i]->rotation)) * - XMMatrixTranslationFromVector(XMLoadFloat3(&everyObject[i]->translation) + XMMatrixRotationQuaternion(XMLoadFloat4(&o->rotation)) * + XMMatrixTranslationFromVector(XMLoadFloat3(&o->translation) ); - XMStoreFloat4x4(&everyObject[i]->world,w); + XMStoreFloat4x4(&o->world,w); } - if(everyObject[i]->mesh->softBody) - everyObject[i]->bounds=everyObject[i]->mesh->aabb; - else if(!everyObject[i]->mesh->isBillboarded && everyObject[i]->mesh->renderable){ - everyObject[i]->bounds=everyObject[i]->mesh->aabb.get(world); + if(o->mesh->softBody) + o->bounds=o->mesh->aabb; + else if(!o->mesh->isBillboarded && o->mesh->renderable){ + o->bounds=o->mesh->aabb.get(world); } - else if(everyObject[i]->mesh->renderable) - everyObject[i]->bounds.createFromHalfWidth(everyObject[i]->translation,everyObject[i]->scale); + else if(o->mesh->renderable) + o->bounds.createFromHalfWidth(o->translation,o->scale); - everyObject[i]->FadeTrail(); + o->FadeTrail(); } } void wiRenderer::UpdateSoftBodyPinning(){ @@ -2511,12 +2455,13 @@ void wiRenderer::DrawTrails(ID3D11DeviceContext* context, ID3D11ShaderResourceVi //context->PSSetSamplers( 0,1,&mirSampler ); BindSamplerPS(mirSampler,0,context); - for (unsigned int i = 0; itrailBuff && everyObject[i]->trail.size()>=4){ + for (Object* o : objects) + { + if(o->trailBuff && o->trail.size()>=4){ - if (everyObject[i]->trailDistortTex != nullptr) + if (o->trailDistortTex != nullptr) { - BindTexturePS(everyObject[i]->trailDistortTex, 1, context); + BindTexturePS(o->trailDistortTex, 1, context); } else { @@ -2527,10 +2472,8 @@ void wiRenderer::DrawTrails(ID3D11DeviceContext* context, ID3D11ShaderResourceVi BindConstantBufferVS(trailCB,0,context); vector trails; - //for(int k=0;ktrail.size();++k) - // trails.push_back(everyObject[i]->trail[k]); - int bounds = everyObject[i]->trail.size(); + int bounds = o->trail.size(); int req = bounds-3; for(int k=0;ktrail[k?(k-2):0].pos ) - ,XMLoadFloat3( &everyObject[i]->trail[k].pos ) - ,XMLoadFloat3( &everyObject[i]->trail[k+2].pos ) - ,XMLoadFloat3( &everyObject[i]->trail[k+6trail[k?(k-2):0].pos ) + ,XMLoadFloat3( &o->trail[k].pos ) + ,XMLoadFloat3( &o->trail[k+2].pos ) + ,XMLoadFloat3( &o->trail[k+6trail[k?(k-1):1].pos ) - ,XMLoadFloat3( &everyObject[i]->trail[k+1].pos ) - ,XMLoadFloat3( &everyObject[i]->trail[k+3].pos ) - ,XMLoadFloat3( &everyObject[i]->trail[k+5trail[k?(k-1):1].pos ) + ,XMLoadFloat3( &o->trail[k+1].pos ) + ,XMLoadFloat3( &o->trail[k+3].pos ) + ,XMLoadFloat3( &o->trail[k+5trail[k].tex,everyObject[i]->trail[k+2].tex,r) - ,wiMath::Lerp(everyObject[i]->trail[k].col,everyObject[i]->trail[k+2].col,r) + ,wiMath::Lerp(o->trail[k].tex,o->trail[k+2].tex,r) + ,wiMath::Lerp(o->trail[k].col,o->trail[k+2].col,r) ,1 )); trails.push_back(RibbonVertex(xpoint1 - ,wiMath::Lerp(everyObject[i]->trail[k+1].tex,everyObject[i]->trail[k+3].tex,r) - ,wiMath::Lerp(everyObject[i]->trail[k+1].col,everyObject[i]->trail[k+3].col,r) + ,wiMath::Lerp(o->trail[k+1].tex,o->trail[k+3].tex,r) + ,wiMath::Lerp(o->trail[k+1].col,o->trail[k+3].col,r) , 1 )); } } if(!trails.empty()){ - UpdateBuffer(everyObject[i]->trailBuff,trails.data(),context,sizeof(RibbonVertex)*trails.size()); - //D3D11_MAPPED_SUBRESOURCE mappedResource2; - //RibbonVertex* dataPtrV; - //context->Map(everyObject[i]->trailBuff,0,D3D11_MAP_WRITE_DISCARD,0,&mappedResource2); - //dataPtrV = (RibbonVertex*)mappedResource2.pData; - //memcpy(dataPtrV,trails.data(),sizeof(RibbonVertex)*trails.size()); - //context->Unmap(everyObject[i]->trailBuff,0); - - //UINT stride = sizeof( RibbonVertex ); - //UINT offset = 0; - //context->IASetVertexBuffers( 0, 1, &everyObject[i]->trailBuff, &stride, &offset ); - + UpdateBuffer(o->trailBuff,trails.data(),context,sizeof(RibbonVertex)*trails.size()); - - //context->Draw(trails.size(),0); - BindVertexBuffer(everyObject[i]->trailBuff,0,sizeof(RibbonVertex),context); + BindVertexBuffer(o->trailBuff,0,sizeof(RibbonVertex),context); Draw(trails.size(),context); trails.clear(); @@ -2840,7 +2770,7 @@ void wiRenderer::DrawVolumeLights(Camera* camera, ID3D11DeviceContext* context) } -void wiRenderer::DrawLensFlares(ID3D11DeviceContext* context, ID3D11ShaderResourceView* depth, const int& RENDERWIDTH, const int& RENDERHEIGHT){ +void wiRenderer::DrawLensFlares(ID3D11DeviceContext* context, ID3D11ShaderResourceView* depth){ CulledList culledObjects; @@ -2866,9 +2796,9 @@ void wiRenderer::DrawLensFlares(ID3D11DeviceContext* context, ID3D11ShaderResour )*100000; } - XMVECTOR flarePos = XMVector3Project(POS,0.f,0.f,(float)RENDERWIDTH,(float)RENDERHEIGHT,0.1f,1.0f,wiRenderer::getCamera()->GetProjection(),wiRenderer::getCamera()->GetView(),XMMatrixIdentity()); + XMVECTOR flarePos = XMVector3Project(POS,0.f,0.f,GetScreenWidth(),GetScreenHeight(),0.1f,1.0f,getCamera()->GetProjection(),getCamera()->GetView(),XMMatrixIdentity()); - if( XMVectorGetX(XMVector3Dot( XMVectorSubtract(POS,wiRenderer::getCamera()->GetEye()),wiRenderer::getCamera()->GetAt() ))>0 ) + if( XMVectorGetX(XMVector3Dot( XMVectorSubtract(POS,getCamera()->GetEye()),getCamera()->GetAt() ))>0 ) wiLensFlare::Draw(depth,context,flarePos,l->lensFlareRimTextures); } @@ -2998,7 +2928,7 @@ void wiRenderer::DrawForShadowMap(ID3D11DeviceContext* context) int k = 0; for (CulledObjectList::iterator viter = visibleInstances.begin(); viter != visibleInstances.end(); ++viter) { - if ((*viter)->particleEmitter != Object::wiParticleEmitter::EMITTER_INVISIBLE) { + if ((*viter)->emitterType != Object::EmitterType::EMITTER_INVISIBLE) { if (mesh->softBody || (*viter)->armatureDeform) Mesh::AddRenderableInstance(Instance(XMMatrixIdentity(), (*viter)->transparency), k); else @@ -3009,7 +2939,7 @@ void wiRenderer::DrawForShadowMap(ID3D11DeviceContext* context) if (k < 1) continue; - mesh->UpdateRenderableInstances(visibleInstances.size(), context); + Mesh::UpdateRenderableInstances(visibleInstances.size(), context); BindVertexBuffer((mesh->sOutBuffer ? mesh->sOutBuffer : mesh->meshVertBuff), 0, sizeof(Vertex), context); @@ -3103,7 +3033,7 @@ void wiRenderer::DrawForShadowMap(ID3D11DeviceContext* context) int k = 0; for (CulledObjectList::iterator viter = visibleInstances.begin(); viter != visibleInstances.end(); ++viter) { - if ((*viter)->particleEmitter != Object::wiParticleEmitter::EMITTER_INVISIBLE) { + if ((*viter)->emitterType != Object::EmitterType::EMITTER_INVISIBLE) { if (mesh->softBody || (*viter)->armatureDeform) Mesh::AddRenderableInstance(Instance(XMMatrixIdentity(), (*viter)->transparency), k); else @@ -3114,7 +3044,7 @@ void wiRenderer::DrawForShadowMap(ID3D11DeviceContext* context) if (k < 1) continue; - mesh->UpdateRenderableInstances(visibleInstances.size(), context); + Mesh::UpdateRenderableInstances(visibleInstances.size(), context); BindVertexBuffer((mesh->sOutBuffer ? mesh->sOutBuffer : mesh->meshVertBuff), 0, sizeof(Vertex), context); @@ -3209,7 +3139,7 @@ void wiRenderer::DrawForShadowMap(ID3D11DeviceContext* context) int k = 0; for (CulledObjectList::iterator viter = visibleInstances.begin(); viter != visibleInstances.end(); ++viter) { - if ((*viter)->particleEmitter != Object::wiParticleEmitter::EMITTER_INVISIBLE) { + if ((*viter)->emitterType != Object::EmitterType::EMITTER_INVISIBLE) { if (mesh->softBody || (*viter)->armatureDeform) Mesh::AddRenderableInstance(Instance(XMMatrixIdentity(), (*viter)->transparency), k); else @@ -3220,7 +3150,7 @@ void wiRenderer::DrawForShadowMap(ID3D11DeviceContext* context) if (k < 1) continue; - mesh->UpdateRenderableInstances(visibleInstances.size(), context); + Mesh::UpdateRenderableInstances(visibleInstances.size(), context); BindVertexBuffer((mesh->sOutBuffer ? mesh->sOutBuffer : mesh->meshVertBuff), 0, sizeof(Vertex), context); @@ -3334,7 +3264,7 @@ void wiRenderer::DrawForShadowMap(ID3D11DeviceContext* context) // if (k<1) // continue; - // mesh->UpdateRenderableInstances(visibleInstances.size(), GRAPHICSTHREAD_SHADOWS, context); + // Mesh::UpdateRenderableInstances(visibleInstances.size(), GRAPHICSTHREAD_SHADOWS, context); // BindVertexBuffer((mesh->sOutBuffer ? mesh->sOutBuffer : mesh->meshVertBuff), 0, sizeof(Vertex), context); @@ -3453,7 +3383,7 @@ void wiRenderer::DrawForShadowMap(ID3D11DeviceContext* context) // if (k<1) // continue; - // mesh->UpdateRenderableInstances(visibleInstances.size(), GRAPHICSTHREAD_SHADOWS, context); + // Mesh::UpdateRenderableInstances(visibleInstances.size(), GRAPHICSTHREAD_SHADOWS, context); // BindVertexBuffer((mesh->sOutBuffer ? mesh->sOutBuffer : mesh->meshVertBuff), 0, sizeof(Vertex), context); @@ -3541,18 +3471,19 @@ void wiRenderer::SetSpotLightShadowProps(int shadowMapCount, int resolution) } void wiRenderer::DrawWorld(Camera* camera, bool DX11Eff, int tessF, ID3D11DeviceContext* context - , bool BlackOut, SHADED_TYPE shaded + , bool BlackOut, SHADERTYPE shaded , ID3D11ShaderResourceView* refRes, bool grass, GRAPHICSTHREAD thread) { - - if(objects.empty()) + if (objects.empty()) + { return; + } CulledCollection culledRenderer; CulledList culledObjects; + culledObjects.reserve(objects.size()); if(spTree) wiSPTree::getVisible(spTree->root, camera->frustum,culledObjects); - //wiSPTree::getAll(spTree->root,culledObjects); if(!culledObjects.empty()) { @@ -3590,11 +3521,11 @@ void wiRenderer::DrawWorld(Camera* camera, bool DX11Eff, int tessF, ID3D11Device else if (BlackOut) BindPS(blackoutPS, context); - else if (shaded == SHADED_NONE) + else if (shaded == SHADERTYPE_NONE) BindPS(textureonlyPS, context); - else if (shaded == SHADED_DEFERRED) + else if (shaded == SHADERTYPE_DEFERRED) BindPS(pixelShader, context); - else if (shaded == SHADED_FORWARD_SIMPLE) + else if (shaded == SHADERTYPE_FORWARD_SIMPLE) BindPS(fowardSimplePS, context); else return; @@ -3652,7 +3583,7 @@ void wiRenderer::DrawWorld(Camera* camera, bool DX11Eff, int tessF, ID3D11Device int k=0; for(CulledObjectList::iterator viter=visibleInstances.begin();viter!=visibleInstances.end();++viter){ - if((*viter)->particleEmitter!=Object::wiParticleEmitter::EMITTER_INVISIBLE){ + if((*viter)->emitterType !=Object::EmitterType::EMITTER_INVISIBLE){ if (mesh->softBody || (*viter)->armatureDeform) Mesh::AddRenderableInstance(Instance(XMMatrixIdentity(), (*viter)->transparency, (*viter)->color), k); else @@ -3663,7 +3594,7 @@ void wiRenderer::DrawWorld(Camera* camera, bool DX11Eff, int tessF, ID3D11Device if(k<1) continue; - mesh->UpdateRenderableInstances(visibleInstances.size(), context); + Mesh::UpdateRenderableInstances(visibleInstances.size(), context); BindIndexBuffer(mesh->meshIndexBuff,context); @@ -3712,116 +3643,20 @@ void wiRenderer::DrawWorld(Camera* camera, bool DX11Eff, int tessF, ID3D11Device } } -void wiRenderer::DrawWorldWater(Camera* camera, ID3D11ShaderResourceView* refracRes, ID3D11ShaderResourceView* refRes - , ID3D11ShaderResourceView* depth, ID3D11ShaderResourceView* nor, ID3D11DeviceContext* context){ - - if(objects_water.empty()) - return; - - CulledCollection culledRenderer; - CulledList culledObjects; - if(spTree_water) - wiSPTree::getVisible(spTree_water->root, camera->frustum,culledObjects); - - if(!culledObjects.empty()) +void wiRenderer::DrawWorldTransparent(Camera* camera, ID3D11ShaderResourceView* refracRes, ID3D11ShaderResourceView* refRes + , ID3D11ShaderResourceView* waterRippleNormals, ID3D11ShaderResourceView* depth, ID3D11DeviceContext* context) +{ + if (objects.empty()) { - for(Cullable* object : culledObjects) - culledRenderer[((Object*)object)->mesh].insert((Object*)object); - - - BindPrimitiveTopology(TRIANGLELIST,context); - BindVertexLayout(vertexLayout,context); - BindPS(wireRender?simplestPS:waterPS,context); - BindVS(vertexShader10,context); - - BindSamplerPS(texSampler,0,context); - BindSamplerPS(mapSampler,1,context); - - if(!wireRender) BindTexturePS(enviroMap,0,context); - if(!wireRender) BindTexturePS(refRes,1,context); - if(!wireRender) BindTexturePS(refracRes,2,context); - if(!wireRender) BindTexturePS(depth,7,context); - if(!wireRender) BindTexturePS(nor,8,context); - - - BindConstantBufferVS(staticCb,0,context); - BindConstantBufferPS(pixelCB,0,context); - BindConstantBufferPS(fxCb,1,context); - BindConstantBufferVS(constantBuffer,3,context); - BindConstantBufferVS(matCb,2,context); - BindConstantBufferPS(matCb,2,context); - - - BindBlendState(blendState,context); - BindDepthStencilState(depthReadStencilState,STENCILREF_EMPTY,context); - BindRasterizerState(wireRender?wireRS:nonCullRS,context); - - - - for (CulledCollection::iterator iter = culledRenderer.begin(); iter != culledRenderer.end(); ++iter) { - Mesh* mesh = iter->first; - CulledObjectList& visibleInstances = iter->second; - - - int matsiz = mesh->materialIndices.size(); - - - int k = 0; - for (CulledObjectList::iterator viter = visibleInstances.begin(); viter != visibleInstances.end(); ++viter){ - if ((*viter)->particleEmitter != Object::wiParticleEmitter::EMITTER_INVISIBLE){ - if (mesh->softBody || (*viter)->armatureDeform) - Mesh::AddRenderableInstance(Instance(XMMatrixIdentity()), k); - else - Mesh::AddRenderableInstance(Instance(XMMatrixTranspose(XMLoadFloat4x4(&(*viter)->world))), k); - ++k; - } - } - if (k<1) - continue; - - mesh->UpdateRenderableInstances(visibleInstances.size(), context); - - BindIndexBuffer(mesh->meshIndexBuff,context); - BindVertexBuffer((mesh->sOutBuffer?mesh->sOutBuffer:mesh->meshVertBuff),0,sizeof(Vertex),context); - BindVertexBuffer(mesh->meshInstanceBuffer,1,sizeof(Instance),context); - - int m=0; - for(Material* iMat : mesh->materials){ - - if(iMat->water){ - - - static thread_local MaterialCB* mcb = new MaterialCB; - (*mcb).Create(*iMat, m); - - UpdateBuffer(matCb, mcb, context); - - if(!wireRender) BindTexturePS(iMat->texture,3,context); - if(!wireRender) BindTexturePS(iMat->refMap,4,context); - if(!wireRender) BindTexturePS(iMat->normalMap,5,context); - if(!wireRender) BindTexturePS(iMat->specularMap,6,context); - - DrawIndexedInstanced(mesh->indices.size(),visibleInstances.size(),context); - } - m++; - } - } - + return; } -} -void wiRenderer::DrawWorldTransparent(Camera* camera, ID3D11ShaderResourceView* refracRes, ID3D11ShaderResourceView* refRes - , ID3D11ShaderResourceView* depth, ID3D11DeviceContext* context){ - - if(objects_trans.empty()) - return; - - CulledCollection culledRenderer; CulledList culledObjects; - if(spTree_trans) - wiSPTree::getVisible(spTree_trans->root, camera->frustum,culledObjects); + culledObjects.reserve(objects.size()); + if (spTree) + wiSPTree::getVisible(spTree->root, camera->frustum,culledObjects); if(!culledObjects.empty()) { @@ -3830,7 +3665,6 @@ void wiRenderer::DrawWorldTransparent(Camera* camera, ID3D11ShaderResourceView* BindPrimitiveTopology(TRIANGLELIST,context); BindVertexLayout(vertexLayout,context); - BindPS(wireRender?simplestPS:transparentPS,context); BindVS(vertexShader10,context); BindSamplerPS(texSampler,0,context); @@ -3840,6 +3674,7 @@ void wiRenderer::DrawWorldTransparent(Camera* camera, ID3D11ShaderResourceView* if(!wireRender) BindTexturePS(refRes,1,context); if(!wireRender) BindTexturePS(refracRes,2,context); if(!wireRender) BindTexturePS(depth,7,context); + if(!wireRender) BindTexturePS(waterRippleNormals, 8, context); BindConstantBufferVS(staticCb,0,context); @@ -3850,20 +3685,30 @@ void wiRenderer::DrawWorldTransparent(Camera* camera, ID3D11ShaderResourceView* BindConstantBufferPS(matCb,2,context); BindBlendState(blendState,context); - BindDepthStencilState(depthStencilState,STENCILREF_TRANSPARENT,context); - BindRasterizerState(wireRender?wireRS:rasterizerState,context); + RENDERTYPE lastRenderType = RENDERTYPE_VOID; for (CulledCollection::iterator iter = culledRenderer.begin(); iter != culledRenderer.end(); ++iter) { Mesh* mesh = iter->first; CulledObjectList& visibleInstances = iter->second; + bool isValid = false; + for (Material* iMat : mesh->materials) + { + if (iMat->IsTransparent() || iMat->IsWater()) + { + isValid = true; + break; + } + } + if (!isValid) + continue; - - if(!mesh->doubleSided) - context->RSSetState(wireRender?wireRS:rasterizerState); + if (!mesh->doubleSided) + BindRasterizerState(wireRender ? wireRS : rasterizerState, context); else - context->RSSetState(wireRender?wireRS:nonCullRS); + BindRasterizerState(wireRender ? wireRS : nonCullRS, context); + int matsiz = mesh->materialIndices.size(); @@ -3871,7 +3716,7 @@ void wiRenderer::DrawWorldTransparent(Camera* camera, ID3D11ShaderResourceView* int k = 0; for (CulledObjectList::iterator viter = visibleInstances.begin(); viter != visibleInstances.end(); ++viter){ - if ((*viter)->particleEmitter != Object::wiParticleEmitter::EMITTER_INVISIBLE){ + if ((*viter)->emitterType != Object::EmitterType::EMITTER_INVISIBLE){ if (mesh->softBody || (*viter)->armatureDeform) Mesh::AddRenderableInstance(Instance(XMMatrixIdentity(), (*viter)->transparency, (*viter)->color), k); else @@ -3882,7 +3727,7 @@ void wiRenderer::DrawWorldTransparent(Camera* camera, ID3D11ShaderResourceView* if (k<1) continue; - mesh->UpdateRenderableInstances(visibleInstances.size(), context); + Mesh::UpdateRenderableInstances(visibleInstances.size(), context); BindIndexBuffer(mesh->meshIndexBuff,context); @@ -3892,21 +3737,38 @@ void wiRenderer::DrawWorldTransparent(Camera* camera, ID3D11ShaderResourceView* int m=0; for(Material* iMat : mesh->materials){ + if (iMat->isSky) + continue; - if(iMat->IsTransparent() && iMat->alpha>0 && !iMat->water && !iMat->isSky){ + if(iMat->IsTransparent() || iMat->IsWater()) + { + static thread_local MaterialCB* mcb = new MaterialCB; + (*mcb).Create(*iMat, m); + UpdateBuffer(matCb, mcb, context); - static thread_local MaterialCB* mcb = new MaterialCB; - (*mcb).Create(*iMat, m); + if(!wireRender) BindTexturePS(iMat->texture,3,context); + if(!wireRender) BindTexturePS(iMat->refMap,4,context); + if(!wireRender) BindTexturePS(iMat->normalMap,5,context); + if(!wireRender) BindTexturePS(iMat->specularMap,6,context); - UpdateBuffer(matCb, mcb, context); + if (iMat->IsTransparent() && lastRenderType != RENDERTYPE_TRANSPARENT) + { + lastRenderType = RENDERTYPE_TRANSPARENT; - if(!wireRender) BindTexturePS(iMat->texture,3,context); - if(!wireRender) BindTexturePS(iMat->refMap,4,context); - if(!wireRender) BindTexturePS(iMat->normalMap,5,context); - if(!wireRender) BindTexturePS(iMat->specularMap,6,context); + BindDepthStencilState(depthStencilState, STENCILREF_TRANSPARENT, context); + BindPS(wireRender ? simplestPS : transparentPS, context); + } + if (iMat->IsWater() && lastRenderType != RENDERTYPE_WATER) + { + lastRenderType = RENDERTYPE_WATER; + + BindDepthStencilState(depthReadStencilState, STENCILREF_EMPTY, context); + BindPS(wireRender ? simplestPS : waterPS, context); + BindRasterizerState(wireRender ? wireRS : nonCullRS, context); + } - DrawIndexedInstanced(mesh->indices.size(),visibleInstances.size(),context); + DrawIndexedInstanced(mesh->indices.size(),visibleInstances.size(),context); } m++; } @@ -4061,14 +3923,9 @@ void wiRenderer::UpdatePerEffectCB(ID3D11DeviceContext* context, const XMFLOAT4& } void wiRenderer::FinishLoading(){ - everyObject.reserve(objects.size() + objects_trans.size() + objects_water.size()); - everyObject.insert(everyObject.end(), objects.begin(), objects.end()); - everyObject.insert(everyObject.end(), objects_trans.begin(), objects_trans.end()); - everyObject.insert(everyObject.end(), objects_water.begin(), objects_water.end()); - physicsEngine->FirstRunWorld(); physicsEngine->addWind(wind.direction); - for (Object* o : everyObject){ + for (Object* o : objects){ for (wiEmittedParticle* e : o->eParticleSystems){ emitterSystems[e->name].push_back(e); if (e->light != nullptr) @@ -4085,8 +3942,6 @@ void wiRenderer::FinishLoading(){ UpdateRenderInfo(nullptr); UpdateLights(); GenerateSPTree(spTree,vector(objects.begin(),objects.end()),SPTREE_GENERATE_OCTREE); - GenerateSPTree(spTree_trans,vector(objects_trans.begin(),objects_trans.end()),SPTREE_GENERATE_OCTREE); - GenerateSPTree(spTree_water,vector(objects_water.begin(),objects_water.end()),SPTREE_GENERATE_OCTREE); GenerateSPTree(spTree_lights,vector(lights.begin(),lights.end()),SPTREE_GENERATE_OCTREE); SetUpCubes(); SetUpBoneLines(); @@ -4129,10 +3984,10 @@ void wiRenderer::SetUpLights() float lerp1 = 0.12f; float lerp2 = 0.016f; XMVECTOR a0,a,b0,b; - a0 = XMVector3Unproject(XMVectorSet(0, (float)RENDERHEIGHT, 0, 1), 0, 0, (float)RENDERWIDTH, (float)RENDERHEIGHT, 0.1f, 1.0f, wiRenderer::getCamera()->GetProjection(), wiRenderer::getCamera()->GetView(), XMMatrixIdentity()); - a = XMVector3Unproject(XMVectorSet(0, (float)RENDERHEIGHT, 1, 1), 0, 0, (float)RENDERWIDTH, (float)RENDERHEIGHT, 0.1f, 1.0f, wiRenderer::getCamera()->GetProjection(), wiRenderer::getCamera()->GetView(), XMMatrixIdentity()); - b0 = XMVector3Unproject(XMVectorSet((float)RENDERWIDTH, (float)RENDERHEIGHT, 0, 1), 0, 0, (float)RENDERWIDTH, (float)RENDERHEIGHT, 0.1f, 1.0f, wiRenderer::getCamera()->GetProjection(), wiRenderer::getCamera()->GetView(), XMMatrixIdentity()); - b = XMVector3Unproject(XMVectorSet((float)RENDERWIDTH, (float)RENDERHEIGHT, 1, 1), 0, 0, (float)RENDERWIDTH, (float)RENDERHEIGHT, 0.1f, 1.0f, wiRenderer::getCamera()->GetProjection(), wiRenderer::getCamera()->GetView(), XMMatrixIdentity()); + a0 = XMVector3Unproject(XMVectorSet(0, (float)GetScreenHeight(), 0, 1), 0, 0, (float)GetScreenWidth(), (float)GetScreenHeight(), 0.1f, 1.0f, wiRenderer::getCamera()->GetProjection(), wiRenderer::getCamera()->GetView(), XMMatrixIdentity()); + a = XMVector3Unproject(XMVectorSet(0, (float)GetScreenHeight(), 1, 1), 0, 0, (float)GetScreenWidth(), (float)GetScreenHeight(), 0.1f, 1.0f, wiRenderer::getCamera()->GetProjection(), wiRenderer::getCamera()->GetView(), XMMatrixIdentity()); + b0 = XMVector3Unproject(XMVectorSet((float)GetScreenWidth(), (float)GetScreenHeight(), 0, 1), 0, 0, (float)GetScreenWidth(), (float)GetScreenHeight(), 0.1f, 1.0f, wiRenderer::getCamera()->GetProjection(), wiRenderer::getCamera()->GetView(), XMMatrixIdentity()); + b = XMVector3Unproject(XMVectorSet((float)GetScreenWidth(), (float)GetScreenHeight(), 1, 1), 0, 0, (float)GetScreenWidth(), (float)GetScreenHeight(), 0.1f, 1.0f, wiRenderer::getCamera()->GetProjection(), wiRenderer::getCamera()->GetView(), XMMatrixIdentity()); float size=XMVectorGetX(XMVector3Length(XMVectorSubtract(XMVectorLerp(b0,b,lerp),XMVectorLerp(a0,a,lerp)))); float size1=XMVectorGetX(XMVector3Length(XMVectorSubtract(XMVectorLerp(b0,b,lerp1),XMVectorLerp(a0,a,lerp1)))); float size2=XMVectorGetX(XMVector3Length(XMVectorSubtract(XMVectorLerp(b0,b,lerp2),XMVectorLerp(a0,a,lerp2)))); @@ -4184,8 +4039,8 @@ void wiRenderer::UpdateLights() float lerp1 = 0.12f;//second slice distance from cam (percentage) float lerp2 = 0.016f;//first slice distance from cam (percentage) XMVECTOR c,d,e,e1,e2; - c = XMVector3Unproject(XMVectorSet((float)RENDERWIDTH / 2, (float)RENDERHEIGHT / 2, 1, 1), 0, 0, (float)RENDERWIDTH, (float)RENDERHEIGHT, 0.1f, 1.0f, wiRenderer::getCamera()->GetProjection(), wiRenderer::getCamera()->GetView(), XMMatrixIdentity()); - d = XMVector3Unproject(XMVectorSet((float)RENDERWIDTH / 2, (float)RENDERHEIGHT / 2, 0, 1), 0, 0, (float)RENDERWIDTH, (float)RENDERHEIGHT, 0.1f, 1.0f, wiRenderer::getCamera()->GetProjection(), wiRenderer::getCamera()->GetView(), XMMatrixIdentity()); + c = XMVector3Unproject(XMVectorSet((float)GetScreenWidth() * 0.5f, (float)GetScreenHeight() * 0.5f, 1, 1), 0, 0, (float)GetScreenWidth(), (float)GetScreenHeight(), 0.1f, 1.0f, getCamera()->GetProjection(), getCamera()->GetView(), XMMatrixIdentity()); + d = XMVector3Unproject(XMVectorSet((float)GetScreenWidth() * 0.5f, (float)GetScreenHeight() * 0.5f, 0, 1), 0, 0, (float)GetScreenWidth(), (float)GetScreenHeight(), 0.1f, 1.0f, getCamera()->GetProjection(), getCamera()->GetView(), XMMatrixIdentity()); if (!l->shadowCam.empty()) { @@ -4210,7 +4065,7 @@ void wiRenderer::UpdateLights() } } - l->bounds.createFromHalfWidth(wiRenderer::getCamera()->translation,XMFLOAT3(10000,10000,10000)); + l->bounds.createFromHalfWidth(getCamera()->translation,XMFLOAT3(10000,10000,10000)); } else if(l->type==Light::SPOT){ if(!l->shadowCam.empty()){ @@ -4246,33 +4101,19 @@ void wiRenderer::UpdateLights() } } -wiRenderer::Picked wiRenderer::Pick(RAY& ray, PICKTYPE pickType, const string& layer, +wiRenderer::Picked wiRenderer::Pick(RAY& ray, int pickType, const string& layer, const string& layerDisable) { CulledCollection culledRenderer; CulledList culledObjects; - wiSPTree* searchTree = nullptr; - switch (pickType) - { - case wiRenderer::PICK_OPAQUE: - searchTree = spTree; - break; - case wiRenderer::PICK_TRANSPARENT: - searchTree = spTree_trans; - break; - case wiRenderer::PICK_WATER: - searchTree = spTree_water; - break; - default: - break; - } + wiSPTree* searchTree = spTree; if (searchTree) { wiSPTree::getVisible(searchTree->root, ray, culledObjects); vector pickPoints; - RayIntersectMeshes(ray, culledObjects, pickPoints, true, layer, layerDisable); + RayIntersectMeshes(ray, culledObjects, pickPoints, pickType, true, layer, layerDisable); if (!pickPoints.empty()){ Picked min = pickPoints.front(); @@ -4288,7 +4129,7 @@ wiRenderer::Picked wiRenderer::Pick(RAY& ray, PICKTYPE pickType, const string& l return Picked(); } -wiRenderer::Picked wiRenderer::Pick(long cursorX, long cursorY, PICKTYPE pickType, const string& layer, +wiRenderer::Picked wiRenderer::Pick(long cursorX, long cursorY, int pickType, const string& layer, const string& layerDisable) { RAY ray = getPickRay(cursorX, cursorY); @@ -4305,9 +4146,14 @@ RAY wiRenderer::getPickRay(long cursorX, long cursorY){ return RAY(lineStart,rayDirection); } -void wiRenderer::RayIntersectMeshes(const RAY& ray, const CulledList& culledObjects, vector& points, - bool dynamicObjects, const string& layer, const string& layerDisable) +void wiRenderer::RayIntersectMeshes(const RAY& ray, const CulledList& culledObjects, vector& points, + int pickType, bool dynamicObjects, const string& layer, const string& layerDisable) { + if (culledObjects.empty()) + { + return; + } + bool checkLayers = false; if (layer.length() > 0) { @@ -4319,57 +4165,59 @@ void wiRenderer::RayIntersectMeshes(const RAY& ray, const CulledList& culledObje dontcheckLayers = true; } - if (!culledObjects.empty()) - { - XMVECTOR& rayOrigin = XMLoadFloat3(&ray.origin); - XMVECTOR& rayDirection = XMLoadFloat3(&ray.direction); + XMVECTOR& rayOrigin = XMLoadFloat3(&ray.origin); + XMVECTOR& rayDirection = XMLoadFloat3(&ray.direction); - for (Cullable* culled : culledObjects){ - Object* object = (Object*)culled; - if (!dynamicObjects && object->isDynamic()) + for (Cullable* culled : culledObjects){ + Object* object = (Object*)culled; + + if (!(pickType & object->GetRenderTypes())) + { + continue; + } + if (!dynamicObjects && object->isDynamic()) + { + continue; + } + + // layer support + if (checkLayers || dontcheckLayers) + { + string id = object->GetID(); + + if (checkLayers && layer.find(id) == string::npos) { continue; } - - // layer support - if (checkLayers || dontcheckLayers) + if (dontcheckLayers && layerDisable.find(id) != string::npos) { - string id = object->GetID(); - - if (checkLayers && layer.find(id) == string::npos) - { - continue; - } - if (dontcheckLayers && layerDisable.find(id) != string::npos) - { - continue; - } + continue; } - - Mesh* mesh = object->mesh; - XMMATRIX& objectMat = XMLoadFloat4x4(&object->world); - - for (unsigned int i = 0; iindices.size(); i += 3){ - int i0 = mesh->indices[i], i1 = mesh->indices[i + 1], i2 = mesh->indices[i + 2]; - Vertex& v0 = mesh->skinnedVertices[i0], v1 = mesh->skinnedVertices[i1], v2 = mesh->skinnedVertices[i2]; - XMVECTOR& V0 = - XMVector4Transform(XMLoadFloat4(&v0.pos), objectMat) - , V1 = XMVector4Transform(XMLoadFloat4(&v1.pos), objectMat) - , V2 = XMVector4Transform(XMLoadFloat4(&v2.pos), objectMat); - float distance = 0; - if (TriangleTests::Intersects(rayOrigin, rayDirection, V0, V1, V2, distance)){ - XMVECTOR& pos = XMVectorAdd(rayOrigin, rayDirection*distance); - XMVECTOR& nor = XMVector3Normalize(XMVector3Cross(XMVectorSubtract(V2, V1), XMVectorSubtract(V1, V0))); - Picked picked = Picked(); - picked.object = object; - XMStoreFloat3(&picked.position, pos); - XMStoreFloat3(&picked.normal, nor); - picked.distance = distance; - points.push_back(picked); - } - } - } + + Mesh* mesh = object->mesh; + XMMATRIX& objectMat = XMLoadFloat4x4(&object->world); + + for (unsigned int i = 0; iindices.size(); i += 3){ + int i0 = mesh->indices[i], i1 = mesh->indices[i + 1], i2 = mesh->indices[i + 2]; + Vertex& v0 = mesh->skinnedVertices[i0], v1 = mesh->skinnedVertices[i1], v2 = mesh->skinnedVertices[i2]; + XMVECTOR& V0 = + XMVector4Transform(XMLoadFloat4(&v0.pos), objectMat) + , V1 = XMVector4Transform(XMLoadFloat4(&v1.pos), objectMat) + , V2 = XMVector4Transform(XMLoadFloat4(&v2.pos), objectMat); + float distance = 0; + if (TriangleTests::Intersects(rayOrigin, rayDirection, V0, V1, V2, distance)){ + XMVECTOR& pos = XMVectorAdd(rayOrigin, rayDirection*distance); + XMVECTOR& nor = XMVector3Normalize(XMVector3Cross(XMVectorSubtract(V2, V1), XMVectorSubtract(V1, V0))); + Picked picked = Picked(); + picked.object = object; + XMStoreFloat3(&picked.position, pos); + XMStoreFloat3(&picked.normal, nor); + picked.distance = distance; + points.push_back(picked); + } + } + } } @@ -4417,7 +4265,7 @@ void wiRenderer::CalculateVertexAO(Object* object) vector points; - RayIntersectMeshes(ray, culledObjects, points, false); + RayIntersectMeshes(ray, culledObjects, points, PICK_OPAQUE, false); if (!points.empty()){ @@ -4443,17 +4291,18 @@ void wiRenderer::CalculateVertexAO(Object* object) mesh->calculatedAO = true; } -void wiRenderer::LoadModel(const string& dir, const string& name, const XMMATRIX& transform, const string& ident, PHYSICS* physicsEngine){ +void wiRenderer::LoadModel(const string& dir, const string& name, const XMMATRIX& transform, const string& ident, PHYSICS* physicsEngine) +{ static int unique_identifier = 0; - vector newObjects(0),newObjects_trans(0),newObjects_water(0); + vector newObjects(0); vector newLights(0); stringstream idss(""); - idss<<"_"/*<(),worldInfo,wind,vector() - ,vector(),everyObject,transforms,decals); + ,transforms,decals); for(Object* o:newObjects){ @@ -4464,46 +4313,17 @@ void wiRenderer::LoadModel(const string& dir, const string& name, const XMMATRIX physicsEngine->registerObject(o); } } - for(Object* o:newObjects_trans){ - o->transform(transform); - o->bounds=o->bounds.get(transform); - o->getTransform(); - if(physicsEngine!=nullptr){ - physicsEngine->registerObject(o); - } - } - for(Object* o:newObjects_water){ - o->transform(transform); - o->bounds=o->bounds.get(transform); - o->getTransform(); - if(physicsEngine!=nullptr){ - physicsEngine->registerObject(o); - } - } - //for(Light* l:newLights){ - // l->transform(transform); - // l->bounds=l->bounds.get(transform); - // l->getTransform(); - //} graphicsMutex.lock(); if(spTree){ spTree->AddObjects(spTree->root,vector(newObjects.begin(),newObjects.end())); } - if(spTree_trans){ - spTree_trans->AddObjects(spTree_trans->root,vector(newObjects_trans.begin(),newObjects_trans.end())); - } - if(spTree_water){ - spTree_water->AddObjects(spTree_water->root,vector(newObjects_water.begin(),newObjects_water.end())); - } if(spTree_lights){ spTree_lights->AddObjects(spTree_lights->root,vector(newLights.begin(),newLights.end())); } objects.insert(objects.end(),newObjects.begin(),newObjects.end()); - objects_trans.insert(objects_trans.end(),newObjects_trans.begin(),newObjects_trans.end()); - objects_water.insert(objects_water.end(),newObjects_water.begin(),newObjects_water.end()); UpdateLights(); lights.insert(lights.end(),newLights.begin(),newLights.end()); @@ -4523,7 +4343,7 @@ void wiRenderer::SychronizeWithPhysicsEngine() if (physicsEngine && GetGameSpeed()){ UpdateSoftBodyPinning(); - for (Object* object : everyObject){ + for (Object* object : objects){ int pI = object->physicsObjectI; if (pI >= 0){ if (object->mesh->softBody){ @@ -4545,7 +4365,7 @@ void wiRenderer::SychronizeWithPhysicsEngine() physicsEngine->Update(); - for (Object* object : everyObject){ + for (Object* object : objects){ int pI = object->physicsObjectI; if (pI >= 0 && !object->kinematic){ PHYSICS::Transform* transform(physicsEngine->getObject(pI)); diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h index 555a296e4..d19e238cc 100644 --- a/WickedEngine/wiRenderer.h +++ b/WickedEngine/wiRenderer.h @@ -1,6 +1,6 @@ #pragma once #include "CommonInclude.h" -#include "wiGraphicsThreads.h" +#include "wiEnums.h" struct Transform; struct Vertex; @@ -127,18 +127,14 @@ public: ,ssClampAni,ssWrapAni,ssMirrorAni,ssComp; - static int RENDERWIDTH,RENDERHEIGHT,SCREENWIDTH,SCREENHEIGHT; + static int SCREENWIDTH,SCREENHEIGHT; static int SHADOWMAPRES,SOFTSHADOW,POINTLIGHTSHADOW,POINTLIGHTSHADOWRES,SPOTLIGHTSHADOW,SPOTLIGHTSHADOWRES; static bool HAIRPARTICLEENABLED, EMITTERSENABLED; static int GetScreenWidth(){ return SCREENWIDTH; } static int GetScreenHeight(){ return SCREENHEIGHT; } - static int GetRenderWidth(){ return RENDERWIDTH; } - static int GetRenderHeight(){ return RENDERHEIGHT; } static int SetScreenWidth(int value){ SCREENWIDTH = value; } static int SetScreenHeight(int value){ SCREENHEIGHT = value; } - static int SetRenderWidth(int value){ RENDERWIDTH = value; } - static int SetRenderHeight(int value){ RENDERHEIGHT = value; } static void SetDirectionalLightShadowProps(int resolution, int softShadowQuality); static void SetPointLightShadowProps(int shadowMapCount, int resolution); static void SetSpotLightShadowProps(int count, int resolution); @@ -1036,23 +1032,15 @@ public: static void UpdatePerViewCB(ID3D11DeviceContext* context, Camera* camera, Camera* refCamera, const XMFLOAT4& newClipPlane = XMFLOAT4(0,0,0,0)); static void UpdatePerEffectCB(ID3D11DeviceContext* context, const XMFLOAT4& blackoutBlackWhiteInvCol, const XMFLOAT4 colorMask); - enum SHADED_TYPE - { - SHADED_NONE=0, - SHADED_DEFERRED=1, - SHADED_FORWARD_SIMPLE=2 - }; static void DrawSky(ID3D11DeviceContext* context); static void DrawWorld(Camera* camera, bool DX11Eff, int tessF, ID3D11DeviceContext* context - , bool BlackOut, SHADED_TYPE shaded, ID3D11ShaderResourceView* refRes, bool grass, GRAPHICSTHREAD thread); + , bool BlackOut, SHADERTYPE shaded, ID3D11ShaderResourceView* refRes, bool grass, GRAPHICSTHREAD thread); static void DrawForSO(ID3D11DeviceContext* context); static void ClearShadowMaps(ID3D11DeviceContext* context); static void DrawForShadowMap(ID3D11DeviceContext* context); - static void DrawWorldWater(Camera* camera, ID3D11ShaderResourceView* refracRes, ID3D11ShaderResourceView* refRes - , ID3D11ShaderResourceView* depth, ID3D11ShaderResourceView* nor, ID3D11DeviceContext* context); static void DrawWorldTransparent(Camera* camera, ID3D11ShaderResourceView* refracRes, ID3D11ShaderResourceView* refRes - , ID3D11ShaderResourceView* depth, ID3D11DeviceContext* context); + , ID3D11ShaderResourceView* waterRippleNormals, ID3D11ShaderResourceView* depth, ID3D11DeviceContext* context); void DrawDebugSpheres(Camera* camera, ID3D11DeviceContext* context); static void DrawDebugBoneLines(Camera* camera, ID3D11DeviceContext* context); static void DrawDebugLines(Camera* camera, ID3D11DeviceContext* context); @@ -1068,7 +1056,7 @@ public: , ID3D11ShaderResourceView* depth, ID3D11ShaderResourceView* normal, ID3D11ShaderResourceView* material , unsigned int stencilRef = 2); static void DrawVolumeLights(Camera* camera, ID3D11DeviceContext* context); - static void DrawLensFlares(ID3D11DeviceContext* context, ID3D11ShaderResourceView* depth, const int& RENDERWIDTH, const int& RENDERHEIGHT); + static void DrawLensFlares(ID3D11DeviceContext* context, ID3D11ShaderResourceView* depth); static void DrawDecals(Camera* camera, DeviceContext context, TextureView depth); static XMVECTOR GetSunPosition(); @@ -1078,18 +1066,12 @@ public: static void resetVertexCount(){vertexCount=0;} static int getVisibleObjectCount(){return visibleCount;} static void resetVisibleObjectCount(){visibleCount=0;} - static void setRenderResolution(int w, int h){RENDERWIDTH=w;RENDERHEIGHT=h;}; static void FinishLoading(); static wiSPTree* spTree; - static wiSPTree* spTree_trans; - static wiSPTree* spTree_water; static wiSPTree* spTree_lights; - static vector everyObject; - static vector objects; - static vector objects_trans; - static vector objects_water; + static vector objects; static MeshCollection meshes; static MaterialCollection materials; static vector armatures; @@ -1122,13 +1104,6 @@ public: string DIRECTORY; - // Do not alter order because it is bound to lua manually - enum PICKTYPE - { - PICK_OPAQUE, - PICK_TRANSPARENT, - PICK_WATER, - }; struct Picked { Object* object; @@ -1139,15 +1114,14 @@ public: }; // Pick closest object in the world + // pickType: PICKTYPE enum values ocncatenated with | operator // layer : concatenated string of layers to check against, empty string : all layers will be checked // layerDisable : concatenated string of layers to NOT check against - static Picked Pick(long cursorX, long cursorY, PICKTYPE pickType = PICKTYPE::PICK_OPAQUE, const string& layer = "", - const string& layerDisable = ""); - static Picked Pick(RAY& ray, PICKTYPE pickType = PICKTYPE::PICK_OPAQUE, const string& layer = "", - const string& layerDisable = ""); + static Picked Pick(long cursorX, long cursorY, int pickType = PICK_OPAQUE, const string& layer = "", const string& layerDisable = ""); + static Picked Pick(RAY& ray, int pickType = PICK_OPAQUE, const string& layer = "", const string& layerDisable = ""); static RAY getPickRay(long cursorX, long cursorY); static void RayIntersectMeshes(const RAY& ray, const CulledList& culledObjects, vector& points, - bool dynamicObjects = true, const string& layer = "", const string& layerDisable = ""); + int pickType = PICK_OPAQUE, bool dynamicObjects = true, const string& layer = "", const string& layerDisable = ""); static void CalculateVertexAO(Object* object); static PHYSICS* physicsEngine; diff --git a/WickedEngine/wiRenderer_BindLua.cpp b/WickedEngine/wiRenderer_BindLua.cpp index abeb3ea3a..e51a06eeb 100644 --- a/WickedEngine/wiRenderer_BindLua.cpp +++ b/WickedEngine/wiRenderer_BindLua.cpp @@ -94,14 +94,6 @@ namespace wiRenderer_BindLua { ss << x->name << endl; } - for (auto& x : wiRenderer::objects_trans) - { - ss << x->name << endl; - } - for (auto& x : wiRenderer::objects_water) - { - ss << x->name << endl; - } wiLua::SSetString(L, ss.str()); return 1; } @@ -221,16 +213,6 @@ namespace wiRenderer_BindLua wiLua::SSetInt(L, wiRenderer::SCREENHEIGHT); return 1; } - int GetRenderWidth(lua_State* L) - { - wiLua::SSetInt(L, wiRenderer::RENDERWIDTH); - return 1; - } - int GetRenderHeight(lua_State* L) - { - wiLua::SSetInt(L, wiRenderer::RENDERHEIGHT); - return 1; - } int GetCamera(lua_State* L) { Luna::push(L, new Transform_BindLua(wiRenderer::getCamera())); @@ -444,11 +426,11 @@ namespace wiRenderer_BindLua Ray_BindLua* ray = Luna::lightcheck(L, 1); if (ray != nullptr) { - wiRenderer::PICKTYPE pickType = wiRenderer::PICKTYPE::PICK_OPAQUE; + int pickType = PICKTYPE::PICK_OPAQUE; string layer = "", layerDisable = ""; if (argc > 1) { - pickType = (wiRenderer::PICKTYPE)wiLua::SGetInt(L, 2); + pickType = wiLua::SGetInt(L, 2); if (argc > 2) { layer = wiLua::SGetString(L, 3); @@ -578,8 +560,6 @@ namespace wiRenderer_BindLua wiLua::GetGlobal()->RegisterFunc("GetGameSpeed", GetGameSpeed); wiLua::GetGlobal()->RegisterFunc("GetScreenWidth", GetScreenWidth); wiLua::GetGlobal()->RegisterFunc("GetScreenHeight", GetScreenHeight); - wiLua::GetGlobal()->RegisterFunc("GetRenderWidth", GetRenderWidth); - wiLua::GetGlobal()->RegisterFunc("GetRenderHeight", GetRenderHeight); wiLua::GetGlobal()->RegisterFunc("GetCamera", GetCamera); wiLua::GetGlobal()->RegisterFunc("SetGameSpeed", SetGameSpeed); @@ -602,9 +582,10 @@ namespace wiRenderer_BindLua wiLua::GetGlobal()->RegisterFunc("DrawLine", DrawLine); wiLua::GetGlobal()->RegisterFunc("PutWaterRipple", PutWaterRipple); wiLua::GetGlobal()->RegisterFunc("PutDecal", PutDecal); - wiLua::GetGlobal()->RunText("PICK_OPAQUE = 0"); - wiLua::GetGlobal()->RunText("PICK_TRANSPARENT = 1"); - wiLua::GetGlobal()->RunText("PICK_WATER = 2"); + wiLua::GetGlobal()->RunText("PICK_VOID = 0x0000000"); + wiLua::GetGlobal()->RunText("PICK_OPAQUE = 0x0000001"); + wiLua::GetGlobal()->RunText("PICK_TRANSPARENT = 0x0000010"); + wiLua::GetGlobal()->RunText("PICK_WATER = 0x0000100"); wiLua::GetGlobal()->RegisterFunc("ClearWorld", ClearWorld); wiLua::GetGlobal()->RegisterFunc("ReloadShaders", ReloadShaders); diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index ad5d74b9e..fbd6898cc 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -7,7 +7,7 @@ namespace wiVersion // minor features, major bug fixes const int minor = 4; // minor bug fixes, alterations - const int revision = 1; + const int revision = 2; long GetVersion()