diff --git a/WickedEngine/grassHF_GS.hlsli b/WickedEngine/grassHF_GS.hlsli index 4c6f015ec..0ffe97bac 100644 --- a/WickedEngine/grassHF_GS.hlsli +++ b/WickedEngine/grassHF_GS.hlsli @@ -27,6 +27,7 @@ struct QGS_OUT float4 pos2DPrev : SCREENPOSITIONPREV; }; cbuffer cbgs:register(b0){ + float4x4 xWorld; float4x4 xView; float4x4 xProjection; float4x4 xPrevViewProjection; @@ -64,39 +65,46 @@ inline void genBlade(inout TriangleStream< GS_OUT > output, float4x4 xViewProjec element.pos = pos; element.pos.xyz += -right*0.5; + element.pos = mul(element.pos, xWorld); element.pos = mul(element.pos,xViewProjection); element.col = color; output.Append(element); element.pos = pos; element.pos.xyz += right*0.5; + element.pos = mul(element.pos, xWorld); element.pos = mul(element.pos,xViewProjection); output.Append(element); element.pos = pos; element.pos.xyz += -right*0.4+normal*0.3+wind*0.2; + element.pos = mul(element.pos, xWorld); element.pos = mul(element.pos,xViewProjection); element.col = saturate(color*1.2); output.Append(element); element.pos = pos; element.pos.xyz += right*0.4+normal*0.3+wind*0.2; + element.pos = mul(element.pos, xWorld); element.pos = mul(element.pos,xViewProjection); output.Append(element); element.pos = pos; element.pos.xyz += -right*0.2+normal*0.7+wind*1.2; + element.pos = mul(element.pos, xWorld); element.pos = mul(element.pos,xViewProjection); element.col = saturate(color*1.6); output.Append(element); element.pos = pos; element.pos.xyz += right*0.2+normal*0.7+wind*1.2; + element.pos = mul(element.pos, xWorld); element.pos = mul(element.pos,xViewProjection); output.Append(element); element.pos = pos; element.pos.xyz += normal+wind*2.6; + element.pos = mul(element.pos, xWorld); element.pos = mul(element.pos,xViewProjection); element.col = saturate(color*1.9); output.Append(element); @@ -107,41 +115,48 @@ inline void genBlade(inout TriangleStream< GS_OUT > output, float4x4 xViewProjec element.pos = pos; element.pos.xyz += -right*2.3+normal*0.56+wind*2+front; + element.pos = mul(element.pos, xWorld); element.pos = mul(element.pos,xViewProjection); element.col = saturate(color*1.9); output.Append(element); element.pos = pos; element.pos.xyz += -right+normal*0.4+wind+front; + element.pos = mul(element.pos, xWorld); element.pos = mul(element.pos,xViewProjection); element.col = saturate(color*1.3); output.Append(element); element.pos = pos; element.pos.xyz += -right+front*0.5; + element.pos = mul(element.pos, xWorld); element.pos = mul(element.pos,xViewProjection); element.col = color; output.Append(element); element.pos = pos; element.pos.xyz += right; + element.pos = mul(element.pos, xWorld); element.pos = mul(element.pos,xViewProjection); output.Append(element); element.pos = pos; element.pos.xyz += right+normal*0.6+wind*1.6; + element.pos = mul(element.pos, xWorld); element.pos = mul(element.pos,xViewProjection); element.col = saturate(color*1.5); output.Append(element); element.pos = pos; element.pos.xyz += right*2+normal*0.6+wind*1.6; + element.pos = mul(element.pos, xWorld); element.pos = mul(element.pos,xViewProjection); element.col = saturate(color*1.7); output.Append(element); element.pos = pos; element.pos.xyz += right*3.4+normal+wind*2.8; + element.pos = mul(element.pos, xWorld); element.pos = mul(element.pos,xViewProjection); element.col = saturate(color*1.9); output.Append(element); diff --git a/WickedEngine/qGrassLCloseGS.hlsl b/WickedEngine/qGrassLCloseGS.hlsl index e8b218074..089d26881 100644 --- a/WickedEngine/qGrassLCloseGS.hlsl +++ b/WickedEngine/qGrassLCloseGS.hlsl @@ -34,6 +34,7 @@ void main( element.tex=float2(0,0); element.pos=pos; element.pos.xyz+=-right*frame.x+normal*frame.y+wind; + element.pos = mul(element.pos, xWorld); float4 savedPos = element.pos; element.pos = element.pos2D = mul(element.pos, xViewProjection); element.pos2DPrev = mul(savedPos, xPrevViewProjection); @@ -42,6 +43,7 @@ void main( element.tex=float2(1,0); element.pos=pos; element.pos.xyz+=right*frame.x+normal*frame.y+wind; + element.pos = mul(element.pos, xWorld); savedPos = element.pos; element.pos = element.pos2D = mul(element.pos, xViewProjection); element.pos2DPrev = mul(savedPos, xPrevViewProjection); @@ -50,6 +52,7 @@ void main( element.tex=float2(0,1); element.pos=pos; element.pos.xyz += -right*frame.x; + element.pos = mul(element.pos, xWorld); savedPos = element.pos; element.pos = element.pos2D = mul(element.pos, xViewProjection); element.pos2DPrev = mul(savedPos, xPrevViewProjection); @@ -58,6 +61,7 @@ void main( element.tex=float2(1,1); element.pos=pos; element.pos.xyz += right*frame.x; + element.pos = mul(element.pos, xWorld); savedPos = element.pos; element.pos = element.pos2D = mul(element.pos, xViewProjection); element.pos2DPrev = mul(savedPos, xPrevViewProjection); @@ -70,6 +74,7 @@ void main( element.tex=float2(0,0); element.pos=pos; element.pos.xyz += -front*frame.x + normal*frame.y + wind; + element.pos = mul(element.pos, xWorld); savedPos = element.pos; element.pos = element.pos2D = mul(element.pos, xViewProjection); element.pos2DPrev = mul(savedPos, xPrevViewProjection); @@ -78,6 +83,7 @@ void main( element.tex=float2(1,0); element.pos=pos; element.pos.xyz += front*frame.x + normal*frame.y + wind; + element.pos = mul(element.pos, xWorld); savedPos = element.pos; element.pos = element.pos2D = mul(element.pos, xViewProjection); element.pos2DPrev = mul(savedPos, xPrevViewProjection); @@ -86,6 +92,7 @@ void main( element.tex=float2(0,1); element.pos=pos; element.pos.xyz += -front*frame.x; + element.pos = mul(element.pos, xWorld); savedPos = element.pos; element.pos = element.pos2D = mul(element.pos, xViewProjection); element.pos2DPrev = mul(savedPos, xPrevViewProjection); @@ -94,6 +101,7 @@ void main( element.tex=float2(1,1); element.pos=pos; element.pos.xyz += front*frame.x; + element.pos = mul(element.pos, xWorld); savedPos = element.pos; element.pos = element.pos2D = mul(element.pos, xViewProjection); element.pos2DPrev = mul(savedPos, xPrevViewProjection); diff --git a/WickedEngine/qGrassLDistGS.hlsl b/WickedEngine/qGrassLDistGS.hlsl index 880f66315..79b78ab07 100644 --- a/WickedEngine/qGrassLDistGS.hlsl +++ b/WickedEngine/qGrassLDistGS.hlsl @@ -42,6 +42,7 @@ void main( element.tex=float2(rand%2?1:0,0); element.pos=pos; element.pos.xyz+=-right*frame.x+normal*frame.y+wind; + element.pos = mul(element.pos, xWorld); float4 savedPos = element.pos; element.pos = element.pos2D = mul(element.pos,xViewProjection); element.pos2DPrev = mul(savedPos, xPrevViewProjection); @@ -50,6 +51,7 @@ void main( element.tex=float2(rand%2?0:1,0); element.pos=pos; element.pos.xyz+=right*frame.x+normal*frame.y+wind; + element.pos = mul(element.pos, xWorld); savedPos = element.pos; element.pos = element.pos2D = mul(element.pos, xViewProjection); element.pos2DPrev = mul(savedPos, xPrevViewProjection); @@ -58,6 +60,7 @@ void main( element.tex=float2(rand%2?1:0,1); element.pos=pos; element.pos.xyz += -right*frame.x; + element.pos = mul(element.pos, xWorld); savedPos = element.pos; element.pos = element.pos2D = mul(element.pos, xViewProjection); element.pos2DPrev = mul(savedPos, xPrevViewProjection); @@ -66,6 +69,7 @@ void main( element.tex=float2(rand%2?0:1,1); element.pos=pos; element.pos.xyz += right*frame.x; + element.pos = mul(element.pos, xWorld); savedPos = element.pos; element.pos = element.pos2D = mul(element.pos, xViewProjection); element.pos2DPrev = mul(savedPos, xPrevViewProjection); diff --git a/WickedEngine/wiFrustum.cpp b/WickedEngine/wiFrustum.cpp index 4dbafe429..79b21b224 100644 --- a/WickedEngine/wiFrustum.cpp +++ b/WickedEngine/wiFrustum.cpp @@ -8,7 +8,7 @@ void Frustum::CleanUp() { } -void Frustum::ConstructFrustum(float screenDepth, XMFLOAT4X4 projectionMatrix, XMFLOAT4X4 viewMatrix) +void Frustum::ConstructFrustum(float screenDepth, XMFLOAT4X4 projectionMatrix, const XMFLOAT4X4& viewMatrix, const XMMATRIX& world) { view=viewMatrix; @@ -23,7 +23,7 @@ void Frustum::ConstructFrustum(float screenDepth, XMFLOAT4X4 projectionMatrix, X projectionMatrix._43 = -r * zMinimum; // Create the frustum matrix from the view matrix and updated projection matrix. - XMStoreFloat4x4( &matrix,XMMatrixMultiply(XMLoadFloat4x4(&viewMatrix), XMLoadFloat4x4(&projectionMatrix)) ); + XMStoreFloat4x4(&matrix, XMMatrixMultiply(XMMatrixMultiply(XMLoadFloat4x4(&viewMatrix),world), XMLoadFloat4x4(&projectionMatrix))); // Calculate near plane of frustum. m_planes[0].x = matrix._14 + matrix._13; diff --git a/WickedEngine/wiFrustum.h b/WickedEngine/wiFrustum.h index 4730802a4..83f059f5f 100644 --- a/WickedEngine/wiFrustum.h +++ b/WickedEngine/wiFrustum.h @@ -11,7 +11,7 @@ public: Frustum(); void CleanUp(); - void ConstructFrustum(float screenDepth, XMFLOAT4X4 projectionMatrix, XMFLOAT4X4 viewMatrix); + void ConstructFrustum(float screenDepth, XMFLOAT4X4 projectionMatrix, const XMFLOAT4X4& viewMatrix, const XMMATRIX& world = XMMatrixIdentity()); bool CheckPoint(const XMFLOAT3&); bool CheckSphere(const XMFLOAT3&, float); diff --git a/WickedEngine/wiHairParticle.cpp b/WickedEngine/wiHairParticle.cpp index 0d81c1f17..89d1f6fdc 100644 --- a/WickedEngine/wiHairParticle.cpp +++ b/WickedEngine/wiHairParticle.cpp @@ -30,6 +30,7 @@ wiHairParticle::wiHairParticle(const string& newName, float newLen, int newCount count=newCount; material=nullptr; object = newObject; + XMStoreFloat4x4(&OriginalMatrix_Inverse, XMMatrixInverse(nullptr, object->getMatrix())); for(Material* m : object->mesh->materials) if(!newMat.compare(m->name)){ material = m; @@ -371,9 +372,31 @@ void wiHairParticle::SetUpPatches() } void wiHairParticle::Draw(Camera* camera, ID3D11DeviceContext *context) { - + XMMATRIX inverseMat = XMLoadFloat4x4(&OriginalMatrix_Inverse); + XMMATRIX renderMatrix = inverseMat * object->getMatrix(); + XMMATRIX inverseRenderMat = XMMatrixInverse(nullptr, renderMatrix); + static thread_local Frustum frustum = Frustum(); - frustum.ConstructFrustum((float)LOD[2], camera->Projection, camera->View); + + // Culling camera needs to be transformed according to hair ps transform (inverse) + XMFLOAT4X4 cull_View; + XMFLOAT3 eye; + { + XMMATRIX View; + XMVECTOR At = XMVectorSet(0, 0, 1, 0), Up = XMVectorSet(0, 1, 0, 0), Eye; + + XMMATRIX camRot = XMMatrixRotationQuaternion(XMLoadFloat4(&camera->rotation)); + At = XMVector3Normalize(XMVector3Transform(XMVector3Transform(At, camRot), inverseRenderMat)); + Up = XMVector3Normalize(XMVector3Transform(XMVector3Transform(Up, camRot), inverseRenderMat)); + Eye = XMVector3Transform(camera->GetEye(), inverseRenderMat); + + View = XMMatrixLookToLH(Eye, At, Up); + + XMStoreFloat4x4(&cull_View, View); + XMStoreFloat3(&eye, Eye); + } + + frustum.ConstructFrustum((float)LOD[2], camera->Projection, cull_View); CulledList culledPatches; @@ -401,11 +424,12 @@ void wiHairParticle::Draw(Camera* camera, ID3D11DeviceContext *context) static thread_local CBGS* gcb = new CBGS; + (*gcb).mWorld = XMMatrixTranspose(renderMatrix); (*gcb).mView = XMMatrixTranspose(camera->GetView()); (*gcb).mProj = XMMatrixTranspose(camera->GetProjection()); (*gcb).mPrevViewProjection = XMMatrixTranspose(wiRenderer::prevFrameCam->GetViewProjection()); (*gcb).colTime=XMFLOAT4(material->diffuseColor.x,material->diffuseColor.y,material->diffuseColor.z, wiRenderer::GetScene().wind.time); - (*gcb).eye=camera->translation; + (*gcb).eye = eye; (*gcb).drawdistance = (float)LOD[2]; (*gcb).wind=wiRenderer::GetScene().wind.direction; (*gcb).windRandomness=wiRenderer::GetScene().wind.randomness; @@ -432,7 +456,7 @@ void wiHairParticle::Draw(Camera* camera, ID3D11DeviceContext *context) Cullable* culled = *iter; Patch* patch = ((PatchHolder*)culled)->patch; - float dis = wiMath::Distance(camera->translation,((PatchHolder*)culled)->bounds.getCenter()); + float dis = wiMath::Distance(eye,((PatchHolder*)culled)->bounds.getCenter()); if(dis patches; wiSPTree* spTree; diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 14bfa3d5c..8779249b8 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -7,7 +7,7 @@ namespace wiVersion // minor features, major bug fixes const int minor = 5; // minor bug fixes, alterations, refactors - const int revision = 0; + const int revision = 1; long GetVersion()