Hairparticlesystem scaling
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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++);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user