Refactor engine to support double-precision vectors

This commit is contained in:
Wojtek Figat
2022-06-13 00:40:32 +02:00
parent f82e370392
commit a881c90b2e
744 changed files with 19062 additions and 12467 deletions

View File

@@ -25,26 +25,26 @@ void ParticleEmitterGraphCPUExecutor::ProcessGroupParameters(Box* box, Node* nod
value = context.Data->Parameters[paramIndex];
switch (param->Type.Type)
{
case VariantType::Vector2:
case VariantType::Float2:
switch (box->ID)
{
case 1:
case 2:
value = value.AsVector2().Raw[box->ID - 1];
value = value.AsFloat2().Raw[box->ID - 1];
break;
}
break;
case VariantType::Vector3:
case VariantType::Float3:
switch (box->ID)
{
case 1:
case 2:
case 3:
value = value.AsVector3().Raw[box->ID - 1];
value = value.AsFloat3().Raw[box->ID - 1];
break;
}
break;
case VariantType::Vector4:
case VariantType::Float4:
case VariantType::Color:
switch (box->ID)
{
@@ -52,7 +52,37 @@ void ParticleEmitterGraphCPUExecutor::ProcessGroupParameters(Box* box, Node* nod
case 2:
case 3:
case 4:
value = value.AsVector4().Raw[box->ID - 1];
value = value.AsFloat4().Raw[box->ID - 1];
break;
}
break;
case VariantType::Double2:
switch (box->ID)
{
case 1:
case 2:
value = value.AsDouble2().Raw[box->ID - 1];
break;
}
break;
case VariantType::Double3:
switch (box->ID)
{
case 1:
case 2:
case 3:
value = value.AsDouble3().Raw[box->ID - 1];
break;
}
break;
case VariantType::Double4:
switch (box->ID)
{
case 1:
case 2:
case 3:
case 4:
value = value.AsDouble4().Raw[box->ID - 1];
break;
}
break;
@@ -157,11 +187,11 @@ void ParticleEmitterGraphCPUExecutor::ProcessGroupTools(Box* box, Node* node, Va
{
GET_VIEW();
const Matrix viewProjection = context.ViewTask ? context.ViewTask->View.PrevViewProjection : Matrix::Identity;
const Vector3 position = (Vector3)TryGetValue(node->GetBox(0), Value::Zero);
Vector4 projPos;
Vector3::Transform(position, viewProjection);
const Float3 position = (Float3)TryGetValue(node->GetBox(0), Value::Zero);
Float4 projPos;
Float3::Transform(position, viewProjection);
projPos /= projPos.W;
value = Vector2(projPos.X * 0.5f + 0.5f, projPos.Y * 0.5f + 0.5f);
value = Float2(projPos.X * 0.5f + 0.5f, projPos.Y * 0.5f + 0.5f);
break;
}
default:
@@ -185,14 +215,14 @@ void ParticleEmitterGraphCPUExecutor::ProcessGroupParticles(Box* box, Node* node
case ParticleAttribute::ValueTypes::Float:
value = *(float*)ptr;
break;
case ParticleAttribute::ValueTypes::Vector2:
value = *(Vector2*)ptr;
case ParticleAttribute::ValueTypes::Float2:
value = *(Float2*)ptr;
break;
case ParticleAttribute::ValueTypes::Vector3:
value = *(Vector3*)ptr;
case ParticleAttribute::ValueTypes::Float3:
value = *(Float3*)ptr;
break;
case ParticleAttribute::ValueTypes::Vector4:
value = *(Vector4*)ptr;
case ParticleAttribute::ValueTypes::Float4:
value = *(Float4*)ptr;
break;
case ParticleAttribute::ValueTypes::Int:
value = *(int32*)ptr;
@@ -214,14 +244,14 @@ void ParticleEmitterGraphCPUExecutor::ProcessGroupParticles(Box* box, Node* node
case ParticleAttribute::ValueTypes::Float:
value = *(float*)ptr;
break;
case ParticleAttribute::ValueTypes::Vector2:
value = *(Vector2*)ptr;
case ParticleAttribute::ValueTypes::Float2:
value = *(Float2*)ptr;
break;
case ParticleAttribute::ValueTypes::Vector3:
value = *(Vector3*)ptr;
case ParticleAttribute::ValueTypes::Float3:
value = *(Float3*)ptr;
break;
case ParticleAttribute::ValueTypes::Vector4:
value = *(Vector4*)ptr;
case ParticleAttribute::ValueTypes::Float4:
value = *(Float4*)ptr;
break;
case ParticleAttribute::ValueTypes::Int:
value = *(int32*)ptr;
@@ -236,7 +266,7 @@ void ParticleEmitterGraphCPUExecutor::ProcessGroupParticles(Box* box, Node* node
// Particle Position
case 101:
{
value = GET_PARTICLE_ATTRIBUTE(0, Vector3);
value = GET_PARTICLE_ATTRIBUTE(0, Float3);
break;
}
// Particle Lifetime
@@ -254,19 +284,19 @@ void ParticleEmitterGraphCPUExecutor::ProcessGroupParticles(Box* box, Node* node
// Particle Color
case 104:
{
value = GET_PARTICLE_ATTRIBUTE(0, Vector4);
value = GET_PARTICLE_ATTRIBUTE(0, Float4);
break;
}
// Particle Velocity
case 105:
{
value = GET_PARTICLE_ATTRIBUTE(0, Vector3);
value = GET_PARTICLE_ATTRIBUTE(0, Float3);
break;
}
// Particle Sprite Size
case 106:
{
value = GET_PARTICLE_ATTRIBUTE(0, Vector2);
value = GET_PARTICLE_ATTRIBUTE(0, Float2);
break;
}
// Particle Mass
@@ -278,13 +308,13 @@ void ParticleEmitterGraphCPUExecutor::ProcessGroupParticles(Box* box, Node* node
// Particle Rotation
case 108:
{
value = GET_PARTICLE_ATTRIBUTE(0, Vector3);
value = GET_PARTICLE_ATTRIBUTE(0, Float3);
break;
}
// Particle Angular Velocity
case 109:
{
value = GET_PARTICLE_ATTRIBUTE(0, Vector3);
value = GET_PARTICLE_ATTRIBUTE(0, Float3);
break;
}
// Particle Normalized Age
@@ -328,13 +358,13 @@ void ParticleEmitterGraphCPUExecutor::ProcessGroupParticles(Box* box, Node* node
// View Position
case 204:
{
value = context.ViewTask ? context.ViewTask->View.Position : Vector3::Zero;
value = context.ViewTask ? context.ViewTask->View.Position : Float3::Zero;
break;
}
// View Direction
case 205:
{
value = context.ViewTask ? context.ViewTask->View.Direction : Vector3::Forward;
value = context.ViewTask ? context.ViewTask->View.Direction : Float3::Forward;
break;
}
// View Far Plane
@@ -346,18 +376,18 @@ void ParticleEmitterGraphCPUExecutor::ProcessGroupParticles(Box* box, Node* node
// Screen Size
case 207:
{
const Vector4 size = context.ViewTask ? context.ViewTask->View.ScreenSize : Vector4::Zero;
const Float4 size = context.ViewTask ? context.ViewTask->View.ScreenSize : Float4::Zero;
if (box->ID == 0)
value = Vector2(size.X, size.Y);
value = Float2(size.X, size.Y);
else
value = Vector2(size.Z, size.W);
value = Float2(size.Z, size.W);
break;
}
// Particle Position (world space)
case 212:
value = GET_PARTICLE_ATTRIBUTE(0, Vector3);
value = GET_PARTICLE_ATTRIBUTE(0, Float3);
if (context.Emitter->SimulationSpace == ParticlesSimulationSpace::Local)
value.AsVector3() = context.Effect->GetTransform().LocalToWorld(value.AsVector3());
value.AsFloat3() = context.Effect->GetTransform().LocalToWorld(value.AsFloat3());
break;
// Particle Emitter Function
case 300:
@@ -387,7 +417,7 @@ void ParticleEmitterGraphCPUExecutor::ProcessGroupParticles(Box* box, Node* node
#endif
// Get function graph
Graph* graph = (Graph*)&function->Graph;
ParticleEmitterGraphCPU* graph = &function->Graph;
context.Functions[nodeBase] = graph;
// Peek the function output (function->Outputs maps the functions outputs to output nodes indices)
@@ -397,7 +427,7 @@ void ParticleEmitterGraphCPUExecutor::ProcessGroupParticles(Box* box, Node* node
value = Value::Zero;
break;
}
Node* functionOutputNode = &graph->Nodes[function->Outputs[outputIndex]];
auto* functionOutputNode = &graph->Nodes[function->Outputs[outputIndex]];
Box* functionOutputBox = functionOutputNode->TryGetBox(0);
// Evaluate the function output
@@ -431,7 +461,7 @@ void ParticleEmitterGraphCPUExecutor::ProcessGroupFunction(Box* box, Node* node,
// Find the function call
Node* functionCallNode = nullptr;
ASSERT(context.GraphStack.Count() >= 2);
Graph* graph;
ParticleEmitterGraphCPU* graph;
for (int32 i = context.CallStackSize - 1; i >= 0; i--)
{
if (context.CallStack[i]->Type == GRAPH_NODE_MAKE_TYPE(14, 300) && context.Functions.TryGet(context.CallStack[i], graph) && context.GraphStack[context.GraphStack.Count() - 1] == graph)