Hairparticlesystem scaling

This commit is contained in:
turanszkij
2016-01-16 20:09:48 +01:00
parent 90ac60d374
commit 02fe909c54
8 changed files with 62 additions and 9 deletions
+15
View File
@@ -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);
+8
View File
@@ -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);
+4
View File
@@ -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);
+2 -2
View File
@@ -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;
+1 -1
View File
@@ -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);
+28 -4
View File
@@ -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<LOD[i]){
culledPatches.erase(iter++);
+3 -1
View File
@@ -33,6 +33,7 @@ private:
Material* material;
GFX_STRUCT CBGS
{
XMMATRIX mWorld;
XMMATRIX mView;
XMMATRIX mProj;
XMMATRIX mPrevViewProjection;
@@ -71,7 +72,8 @@ public:
static void CleanUpStatic();
static void SetUpStatic();
static void Settings(int lod0,int lod1,int lod2);
XMFLOAT4X4 OriginalMatrix_Inverse;
Object* object;
vector<Patch*> patches;
wiSPTree* spTree;
+1 -1
View File
@@ -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()