From 0de4d19a287c84c1a5f8bea81dc68e4b384e5f00 Mon Sep 17 00:00:00 2001 From: turanszkij Date: Sat, 20 Aug 2016 17:35:59 +0200 Subject: [PATCH] impostor system part1 --- WickedEngine/wiGraphicsDevice.h | 1 + WickedEngine/wiGraphicsDevice_DX11.cpp | 6 +- WickedEngine/wiGraphicsDevice_DX11.h | 1 + WickedEngine/wiLoader.cpp | 48 +++++- WickedEngine/wiLoader.h | 16 +- WickedEngine/wiRenderer.cpp | 227 +++++++++++++++++++------ WickedEngine/wiRenderer.h | 2 + 7 files changed, 242 insertions(+), 59 deletions(-) diff --git a/WickedEngine/wiGraphicsDevice.h b/WickedEngine/wiGraphicsDevice.h index e7d1b4d39..c33cf2dcd 100644 --- a/WickedEngine/wiGraphicsDevice.h +++ b/WickedEngine/wiGraphicsDevice.h @@ -106,6 +106,7 @@ namespace wiGraphicsTypes virtual void BindCS(const ComputeShader* shader, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; virtual void Draw(int vertexCount, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; virtual void DrawIndexed(int indexCount, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; + virtual void DrawInstanced(int vertexCount, int instanceCount, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; virtual void DrawIndexedInstanced(int indexCount, int instanceCount, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; virtual void Dispatch(UINT threadGroupCountX, UINT threadGroupCountY, UINT threadGroupCountZ, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; virtual void GenerateMips(Texture* texture, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; diff --git a/WickedEngine/wiGraphicsDevice_DX11.cpp b/WickedEngine/wiGraphicsDevice_DX11.cpp index 832226c95..e6b6f7f32 100644 --- a/WickedEngine/wiGraphicsDevice_DX11.cpp +++ b/WickedEngine/wiGraphicsDevice_DX11.cpp @@ -2169,7 +2169,11 @@ void GraphicsDevice_DX11::DrawIndexed(int indexCount, GRAPHICSTHREAD threadID) { deviceContexts[threadID]->DrawIndexed(indexCount, 0, 0); } -void GraphicsDevice_DX11::DrawIndexedInstanced(int indexCount, int instanceCount, GRAPHICSTHREAD threadID) +void GraphicsDevice_DX11::DrawInstanced(int vertexCount, int instanceCount, GRAPHICSTHREAD threadID) +{ + deviceContexts[threadID]->DrawInstanced(vertexCount, instanceCount, 0, 0); +} +void GraphicsDevice_DX11::DrawIndexedInstanced(int indexCount, int instanceCount, GRAPHICSTHREAD threadID) { deviceContexts[threadID]->DrawIndexedInstanced(indexCount, instanceCount, 0, 0, 0); } diff --git a/WickedEngine/wiGraphicsDevice_DX11.h b/WickedEngine/wiGraphicsDevice_DX11.h index b6f0a25f4..615f97b01 100644 --- a/WickedEngine/wiGraphicsDevice_DX11.h +++ b/WickedEngine/wiGraphicsDevice_DX11.h @@ -121,6 +121,7 @@ namespace wiGraphicsTypes virtual void BindCS(const ComputeShader* shader, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); virtual void Draw(int vertexCount, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); virtual void DrawIndexed(int indexCount, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); + virtual void DrawInstanced(int vertexCount, int instanceCount, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); virtual void DrawIndexedInstanced(int indexCount, int instanceCount, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); virtual void Dispatch(UINT threadGroupCountX, UINT threadGroupCountY, UINT threadGroupCountZ, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); virtual void GenerateMips(Texture* texture, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); diff --git a/WickedEngine/wiLoader.cpp b/WickedEngine/wiLoader.cpp index 9e3317217..9fb61bd76 100644 --- a/WickedEngine/wiLoader.cpp +++ b/WickedEngine/wiLoader.cpp @@ -1629,6 +1629,7 @@ void VertexGroup::Serialize(wiArchive& archive) #pragma region MESH GPUBuffer Mesh::instanceBuffer; +GPUBuffer Mesh::impostorVB; void Mesh::LoadFromFile(const string& newName, const string& fname , const MaterialCollection& materialColl, list armatures, const string& identifier) { @@ -1940,7 +1941,50 @@ void Mesh::CreateBuffers(Object* object) { bd.ByteWidth = sizeof(Instance) * 2; bd.BindFlags = BIND_VERTEX_BUFFER; bd.CPUAccessFlags = CPU_ACCESS_WRITE; - wiRenderer::GetDevice()->CreateBuffer(&bd, 0, &instanceBuffer); + wiRenderer::GetDevice()->CreateBuffer(&bd, nullptr, &instanceBuffer); + } + if (!impostorVB.IsValid()) + { + Vertex impostorVertices[6]; + impostorVertices[0].pos = XMFLOAT4(-1, 1, 0, 1); + impostorVertices[0].nor = XMFLOAT4(0, 0, -1, 1); + impostorVertices[0].tex = XMFLOAT4(0, 0, 0, 0); + impostorVertices[0].pre = XMFLOAT4(-1, 1, 0, 1); + + impostorVertices[1].pos = XMFLOAT4(1, 1, 0, 1); + impostorVertices[1].nor = XMFLOAT4(0, 0, -1, 1); + impostorVertices[1].tex = XMFLOAT4(1, 0, 0, 0); + impostorVertices[1].pre = XMFLOAT4(1, 1, 0, 1); + + impostorVertices[2].pos = XMFLOAT4(-1, -1, 0, 1); + impostorVertices[2].nor = XMFLOAT4(0, 0, -1, 1); + impostorVertices[2].tex = XMFLOAT4(0, 1, 0, 0); + impostorVertices[2].pre = XMFLOAT4(-1, -1, 0, 1); + + impostorVertices[3].pos = XMFLOAT4(-1, -1, 0, 1); + impostorVertices[3].nor = XMFLOAT4(0, 0, -1, 1); + impostorVertices[3].tex = XMFLOAT4(0, 1, 0, 0); + impostorVertices[3].pre = XMFLOAT4(-1, -1, 0, 1); + + impostorVertices[4].pos = XMFLOAT4(1, -1, 0, 1); + impostorVertices[4].nor = XMFLOAT4(0, 0, -1, 1); + impostorVertices[4].tex = XMFLOAT4(1, 1, 0, 0); + impostorVertices[4].pre = XMFLOAT4(1, -1, 0, 1); + + impostorVertices[5].pos = XMFLOAT4(1, 1, 0, 1); + impostorVertices[5].nor = XMFLOAT4(0, 0, -1, 1); + impostorVertices[5].tex = XMFLOAT4(1, 0, 0, 0); + impostorVertices[5].pre = XMFLOAT4(1, 1, 0, 1); + + ZeroMemory(&bd, sizeof(bd)); + bd.Usage = USAGE_IMMUTABLE; + bd.ByteWidth = sizeof(impostorVertices); + bd.BindFlags = BIND_VERTEX_BUFFER; + bd.CPUAccessFlags = 0; + SubresourceData InitData; + ZeroMemory(&InitData, sizeof(InitData)); + InitData.pSysMem = impostorVertices; + wiRenderer::GetDevice()->CreateBuffer(&bd, &InitData, &impostorVB); } @@ -1980,7 +2024,7 @@ void Mesh::CreateBuffers(Object* object) { bd.BindFlags = BIND_STREAM_OUTPUT | BIND_VERTEX_BUFFER; bd.CPUAccessFlags = 0; bd.StructureByteStride = 0; - wiRenderer::GetDevice()->CreateBuffer(&bd, NULL, &streamoutBuffer); + wiRenderer::GetDevice()->CreateBuffer(&bd, nullptr, &streamoutBuffer); } //PHYSICALMAPPING diff --git a/WickedEngine/wiLoader.h b/WickedEngine/wiLoader.h index 86f655728..857f90073 100644 --- a/WickedEngine/wiLoader.h +++ b/WickedEngine/wiLoader.h @@ -369,6 +369,10 @@ struct Mesh{ int massVG,goalVG,softVG; //vertexGroupID vector goalPositions,goalNormals; + vector impostorTargets; + float impostorDistance; + static wiGraphicsTypes::GPUBuffer impostorVB; + Mesh(){ init(); } @@ -411,9 +415,11 @@ struct Mesh{ arraysComplete = false; calculatedAO = false; armatureName = ""; + impostorDistance = 0.0f; } - bool hasArmature()const{return armature!=nullptr;} + bool hasArmature()const { return armature != nullptr; } + bool hasImpostor()const { return !impostorTargets.empty(); } void Serialize(wiArchive& archive); }; struct Cullable @@ -846,7 +852,7 @@ struct Camera:public Transform{ rotation_rest=newRot; name=newName; } - void SetUp(int newWidth, int newHeight, float newNear, float newFar, float fov = XM_PI / 3.0f) + void SetUp(float newWidth, float newHeight, float newNear, float newFar, float fov = XM_PI / 3.0f) { XMMATRIX View = XMMATRIX(); XMVECTOR At = XMVectorSet(0,0,1,0), Up = XMVectorSet(0,1,0,0), Eye = this->GetEye(); @@ -854,8 +860,8 @@ struct Camera:public Transform{ zNearP = newNear; zFarP = newFar; - width = (float)newWidth; - height = (float)newHeight; + width = newWidth; + height = newHeight; this->fov = fov; @@ -931,7 +937,7 @@ struct Camera:public Transform{ } void UpdateProjection() { - XMMATRIX P = XMMatrixPerspectiveFovLH(fov, (float)width / (float)height, zNearP, zFarP); + XMMATRIX P = XMMatrixPerspectiveFovLH(fov, width / height, zNearP, zFarP); XMMATRIX InvP = XMMatrixInverse(nullptr, P); XMStoreFloat4x4(&this->Projection, P); XMStoreFloat4x4(&this->InvProjection, InvP); diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index fb3fb2721..b3d320d1a 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -193,9 +193,9 @@ void wiRenderer::SetUpStaticComponents() //cam = new Camera(GetDevice()->GetScreenWidth(), GetDevice()->GetScreenHeight(), 0.1f, 800, XMVectorSet(0, 4, -4, 1)); cam = new Camera(); - cam->SetUp(GetDevice()->GetScreenWidth(), GetDevice()->GetScreenHeight(), 0.1f, 800); + cam->SetUp((float)GetDevice()->GetScreenWidth(), (float)GetDevice()->GetScreenHeight(), 0.1f, 800); refCam = new Camera(); - refCam->SetUp(GetDevice()->GetScreenWidth(), GetDevice()->GetScreenHeight(), 0.1f, 800); + refCam->SetUp((float)GetDevice()->GetScreenWidth(), (float)GetDevice()->GetScreenHeight(), 0.1f, 800); prevFrameCam = new Camera; @@ -1818,18 +1818,18 @@ void wiRenderer::DrawDebugGridHelper(Camera* camera, GRAPHICSTHREAD threadID) for (int i = 0; i <= a; ++i) { verts[count++] = XMFLOAT4(i - a*0.5f, 0, -a*0.5f, 1); - verts[count++] = (i == a / 2 ? XMFLOAT4(1, 0, 0, 1) : XMFLOAT4(col, col, col, 1)); + verts[count++] = (i == a / 2 ? XMFLOAT4(0, 0, 1, 1) : XMFLOAT4(col, col, col, 1)); verts[count++] = XMFLOAT4(i - a*0.5f, 0, +a*0.5f, 1); - verts[count++] = (i == a / 2 ? XMFLOAT4(1, 0, 0, 1) : XMFLOAT4(col, col, col, 1)); + verts[count++] = (i == a / 2 ? XMFLOAT4(0, 0, 1, 1) : XMFLOAT4(col, col, col, 1)); } for (int j = 0; j <= a; ++j) { verts[count++] = XMFLOAT4(-a*0.5f, 0, j - a*0.5f, 1); - verts[count++] = (j == a / 2 ? XMFLOAT4(0, 0, 1, 1) : XMFLOAT4(col, col, col, 1)); + verts[count++] = (j == a / 2 ? XMFLOAT4(1, 0, 0, 1) : XMFLOAT4(col, col, col, 1)); verts[count++] = XMFLOAT4(+a*0.5f, 0, j - a*0.5f, 1); - verts[count++] = (j == a / 2 ? XMFLOAT4(0, 0, 1, 1) : XMFLOAT4(col, col, col, 1)); + verts[count++] = (j == a / 2 ? XMFLOAT4(1, 0, 0, 1) : XMFLOAT4(col, col, col, 1)); } gridVertexCount = ARRAYSIZE(verts) / 2; @@ -2712,39 +2712,6 @@ void wiRenderer::DrawWorld(Camera* camera, bool DX11Eff, int tessF, GRAPHICSTHRE break; } - //if (!GetScene().environmentProbes.empty()) - //{ - // // Get the closest probes to the camera and bind to shader - // vector sortedEnvProbes; - // vector sortedDistances; - // sortedEnvProbes.reserve(GetScene().environmentProbes.size()); - // sortedDistances.reserve(GetScene().environmentProbes.size()); - // for (unsigned int i = 0; i < GetScene().environmentProbes.size(); ++i) - // { - // sortedEnvProbes.push_back(GetScene().environmentProbes[i]); - // sortedDistances.push_back(wiMath::DistanceSquared(camera->translation, GetScene().environmentProbes[i]->translation)); - // } - // for (unsigned int i = 0; i < sortedEnvProbes.size() - 1; ++i) - // { - // for (unsigned int j = i + 1; j < sortedEnvProbes.size(); ++j) - // { - // if (sortedDistances[i] > sortedDistances[j]) - // { - // float swapDist = sortedDistances[i]; - // sortedDistances[i] = sortedDistances[j]; - // sortedDistances[j] = swapDist; - // EnvironmentProbe* swapProbe = sortedEnvProbes[i]; - // sortedEnvProbes[i] = sortedEnvProbes[j]; - // sortedEnvProbes[j] = swapProbe; - // } - // } - // } - // for (unsigned int i = 0; i < min(sortedEnvProbes.size(), 2); ++i) - // { - // envMaps[i] = sortedEnvProbes[i]->cubeMap.GetTexture(); - // envMapPositions[i] = sortedEnvProbes[i]->translation; - // } - //} MiscCB envProbeCB; envProbeCB.mTransform.r[0] = XMLoadFloat3(&envMapPositions[0]); envProbeCB.mTransform.r[1] = XMLoadFloat3(&envMapPositions[1]); @@ -2796,20 +2763,9 @@ void wiRenderer::DrawWorld(Camera* camera, bool DX11Eff, int tessF, GRAPHICSTHRE if (wireRender) GetDevice()->BindPS(pixelShaders[PSTYPE_SIMPLEST], threadID); - //else - // if (BlackOut) - // GetDevice()->BindPS(pixelShaders[PSTYPE_BLACKOUT], threadID); - // else if (shaderType == SHADERTYPE_NONE) - // GetDevice()->BindPS(pixelShaders[PSTYPE_TEXTUREONLY], threadID); - // else if (shaderType == SHADERTYPE_DEFERRED) - // GetDevice()->BindPS(pixelShaders[PSTYPE_OBJECT_DEFERRED], threadID); - // else if (shaderType == SHADERTYPE_FORWARD_SIMPLE) - // GetDevice()->BindPS(pixelShaders[PSTYPE_OBJECT_FORWARDSIMPLE], threadID); - // else - // return; - GetDevice()->BindBlendState(blendStates[BSTYPE_OPAQUE],threadID); + GetDevice()->BindBlendState(blendStates[BSTYPE_OPAQUE],threadID); if(!wireRender) { if (enviroMap != nullptr) @@ -2830,6 +2786,39 @@ void wiRenderer::DrawWorld(Camera* camera, bool DX11Eff, int tessF, GRAPHICSTHRE CulledObjectList& visibleInstances = iter->second; + if (mesh->hasImpostor()) + { + int k = 0; + for (CulledObjectList::iterator viter = visibleInstances.begin(); viter != visibleInstances.end(); ++viter) { + if ((*viter)->emitterType != Object::EmitterType::EMITTER_INVISIBLE) { + Mesh::AddRenderableInstance(Instance(XMMatrixTranspose(mesh->aabb.getAsBoxMatrix()*XMLoadFloat4x4(&(*viter)->world)), (*viter)->transparency, (*viter)->color), k, threadID); + ++k; + } + } + if (k<1) + continue; + Mesh::UpdateRenderableInstances(visibleInstances.size(), threadID); + + MaterialCB mcb; + ZeroMemory(&mcb, sizeof(mcb)); + mcb.baseColor = XMFLOAT4(1, 1, 1, 1); + mcb.texMulAdd = XMFLOAT4(1, 1, 0, 0); + GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_MATERIAL], &mcb, threadID); + + GetDevice()->BindRasterizerState(wireRender ? rasterizers[RSTYPE_WIRE] : rasterizers[RSTYPE_DOUBLESIDED], threadID); + GetDevice()->BindDepthStencilState(depthStencils[DSSTYPE_DEFAULT], mesh->stencilRef, threadID); + + GetDevice()->BindIndexBuffer(nullptr, threadID); + GetDevice()->BindVertexBuffer(&Mesh::impostorVB, 0, sizeof(Vertex), threadID); + GetDevice()->BindVertexBuffer(&Mesh::instanceBuffer, 1, sizeof(Instance), threadID); + GetDevice()->BindResourcePS(mesh->impostorTargets[0].GetTexture(), TEXSLOT_ONDEMAND0, threadID); + //GetDevice()->BindResourcePS(wiTextureHelper::getInstance()->getColor(wiColor::Red), TEXSLOT_ONDEMAND0, threadID); + GetDevice()->BindVS(vertexShaders[(isReflection?VSTYPE_OBJECT_REFLECTION:VSTYPE_OBJECT10)], threadID); + GetDevice()->BindPS(pixelShaders[(shaderType==SHADERTYPE_DEFERRED?PSTYPE_OBJECT_DEFERRED:PSTYPE_OBJECT_FORWARD_DIRLIGHT)], threadID); + GetDevice()->DrawInstanced(6, visibleInstances.size(), threadID); + continue; + } + if(!mesh->doubleSided) GetDevice()->BindRasterizerState(wireRender?rasterizers[RSTYPE_WIRE]:rasterizers[RSTYPE_FRONT],threadID); else @@ -3995,6 +3984,142 @@ void wiRenderer::PutEnvProbe(const XMFLOAT3& position, int resolution) GetDevice()->UNLOCK(); } +void wiRenderer::CreateImpostor(Mesh* mesh) +{ + const GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE; + + const AABB& bbox = mesh->aabb; + const XMFLOAT3 extents = bbox.getHalfWidth(); + if (mesh->impostorTargets.empty()) + { + mesh->impostorTargets.resize(6); + for (auto& x : mesh->impostorTargets) + { + x.Initialize(512, 512, true, FORMAT_R8G8B8A8_UNORM, 0); + } + } + + Camera savedCam = *cam; + + GetDevice()->LOCK(); + + + Mesh::AddRenderableInstance(Instance(XMMatrixIdentity()), 0, threadID); + Mesh::UpdateRenderableInstances(1, threadID); + GetDevice()->BindVertexBuffer((mesh->streamoutBuffer.IsValid() ? &mesh->streamoutBuffer : &mesh->vertexBuffer), 0, sizeof(Vertex), threadID); + GetDevice()->BindVertexBuffer(&Mesh::instanceBuffer, 1, sizeof(Instance), threadID); + + + GetDevice()->BindBlendState(blendStates[BSTYPE_OPAQUE], threadID); + GetDevice()->BindRasterizerState(rasterizers[RSTYPE_DOUBLESIDED], threadID); + GetDevice()->BindDepthStencilState(depthStencils[DSSTYPE_DEFAULT], mesh->stencilRef, threadID); + GetDevice()->BindPrimitiveTopology(TRIANGLELIST, threadID); + GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_EFFECT], threadID); + GetDevice()->BindVS(vertexShaders[VSTYPE_OBJECT10], threadID); + GetDevice()->BindPS(pixelShaders[PSTYPE_TEXTUREONLY], threadID); + + for (size_t i = 0; i < mesh->impostorTargets.size(); ++i) + { + mesh->impostorTargets[i].Activate(threadID, 0, 0, 0, 0); + + cam->Clear(); + cam->Translate(bbox.getCenter()); + switch (i) + { + case 0: + { + // front capture + XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.x, extents.x, -extents.y, extents.y, -extents.z, extents.z); + XMStoreFloat4x4(&cam->Projection, ortho); + } + break; + case 1: + { + // right capture + XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.z, extents.z, -extents.y, extents.y, -extents.x, extents.x); + XMStoreFloat4x4(&cam->Projection, ortho); + cam->RotateRollPitchYaw(XMFLOAT3(0, -XM_PIDIV2, 0)); + } + break; + case 2: + { + // back capture + XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.x, extents.x, -extents.y, extents.y, -extents.z, extents.z); + XMStoreFloat4x4(&cam->Projection, ortho); + cam->RotateRollPitchYaw(XMFLOAT3(0, XM_PI, 0)); + } + break; + case 3: + { + // left capture + XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.z, extents.z, -extents.y, extents.y, -extents.x, extents.x); + XMStoreFloat4x4(&cam->Projection, ortho); + cam->RotateRollPitchYaw(XMFLOAT3(0, XM_PIDIV2, 0)); + } + break; + case 4: + { + // bottom capture + XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.x, extents.x, -extents.z, extents.z, -extents.y, extents.y); + XMStoreFloat4x4(&cam->Projection, ortho); + cam->RotateRollPitchYaw(XMFLOAT3(-XM_PIDIV2, 0, 0)); + } + break; + case 5: + { + // top capture + XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.x, extents.x, -extents.z, extents.z, -extents.y, extents.y); + XMStoreFloat4x4(&cam->Projection, ortho); + cam->RotateRollPitchYaw(XMFLOAT3(XM_PIDIV2, 0, 0)); + } + break; + default: + break; + } + cam->UpdateProps(); + UpdateCameraCB(threadID); + + for (MeshSubset& subset : mesh->subsets) + { + if (subset.subsetIndices.empty()) + { + continue; + } + if (!subset.material->IsTransparent() && !subset.material->isSky && !subset.material->water) + { + GetDevice()->BindIndexBuffer(&subset.indexBuffer, threadID); + + MaterialCB mcb; + mcb.Create(*subset.material); + GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_MATERIAL], &mcb, threadID); + + GetDevice()->BindResourcePS(subset.material->GetBaseColorMap(), TEXSLOT_ONDEMAND0, threadID); + GetDevice()->BindResourcePS(subset.material->GetNormalMap(), TEXSLOT_ONDEMAND1, threadID); + GetDevice()->BindResourcePS(subset.material->GetRoughnessMap(), TEXSLOT_ONDEMAND2, threadID); + GetDevice()->BindResourcePS(subset.material->GetReflectanceMap(), TEXSLOT_ONDEMAND3, threadID); + GetDevice()->BindResourcePS(subset.material->GetMetalnessMap(), TEXSLOT_ONDEMAND4, threadID); + GetDevice()->BindResourcePS(subset.material->GetDisplacementMap(), TEXSLOT_ONDEMAND5, threadID); + + + GetDevice()->DrawIndexedInstanced(subset.subsetIndices.size(), 1, threadID); + } + } + + GetDevice()->GenerateMips(mesh->impostorTargets[i].GetTexture(), threadID); + } + //GetDevice()->SaveTexturePNG("d:\\asd0.png", mesh->impostorTargets[0].GetTexture(), threadID); + //GetDevice()->SaveTexturePNG("d:\\asd1.png", mesh->impostorTargets[1].GetTexture(), threadID); + //GetDevice()->SaveTexturePNG("d:\\asd2.png", mesh->impostorTargets[2].GetTexture(), threadID); + //GetDevice()->SaveTexturePNG("d:\\asd3.png", mesh->impostorTargets[3].GetTexture(), threadID); + //GetDevice()->SaveTexturePNG("d:\\asd4.png", mesh->impostorTargets[4].GetTexture(), threadID); + //GetDevice()->SaveTexturePNG("d:\\asd5.png", mesh->impostorTargets[5].GetTexture(), threadID); + + *cam = savedCam; + UpdateCameraCB(threadID); + + GetDevice()->UNLOCK(); +} + void wiRenderer::MaterialCB::Create(const Material& mat) { baseColor = XMFLOAT4(mat.baseColor.x, mat.baseColor.y, mat.baseColor.z, mat.alpha); diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h index 2c97cec46..6549e7e74 100644 --- a/WickedEngine/wiRenderer.h +++ b/WickedEngine/wiRenderer.h @@ -472,6 +472,8 @@ public: static void PutEnvProbe(const XMFLOAT3& position, int resolution = 256); + static void CreateImpostor(Mesh* mesh); + static vector renderableTranslators; // Add translator to render in next frame static void AddRenderableTranslator(wiTranslator* translator);