Skip to content

Commit

Permalink
Merge pull request stride3d#33 from Doprez/clean-shapedata
Browse files Browse the repository at this point in the history
Clean shapedata
  • Loading branch information
Nicogo1705 committed Dec 21, 2023
2 parents d61c1bf + ef27072 commit ce4b090
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,9 @@ RenderFeatures:
EffectName: null
PipelineProcessors: {}
8b8c1eec71b780e639f8d35b5f0dde8c*: !Stride.BepuPhysics.Effects.RenderFeatures.SinglePassWireframeRenderFeature,Stride.BepuPhysics
Enable: true
ScaleAdjust: 0.001
LineWidth: 2.0
RenderStageSelectors: {}
SharedRenderers:
60459475d3a3adaf2d1ba5d99913ca75: !Stride.Rendering.Compositing.ForwardRenderer,Stride.Engine
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,13 @@ Entity AddMesh(GraphicsDevice graphicsDevice, Scene rootScene, Vector3 position,
public void AddContainerData(ContainerComponent containerData)
{
var shape = containerData.GetShapeData();

// transform the points to world space
for(int i = 0; i < shape.Points.Count; i++)
{
shape.Points[i] = Vector3.Transform(shape.Points[i], containerData.Entity.Transform.WorldMatrix).XYZ();
}

AppendArrays(shape.Points.ToArray(), shape.Indices.ToArray(), containerData.Entity.Transform.WorldMatrix);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,17 +214,17 @@ public BodyShapeData GetShapeData(TypedIndex typeIndex, bool toLeftHanded = true
case 0:
var sphere = Simulation.Simulation.Shapes.GetShape<Sphere>(index);
meshData = GetSphereVerts(sphere, toLeftHanded);
shapeData = GetBodyShapeData(meshData, Entity.Transform.WorldMatrix);
shapeData = GetBodyShapeData(meshData);
break;
case 1:
var capsule = Simulation.Simulation.Shapes.GetShape<Capsule>(index);
meshData = GetCapsuleVerts(capsule, toLeftHanded);
shapeData = GetBodyShapeData(meshData, Entity.Transform.WorldMatrix);
shapeData = GetBodyShapeData(meshData);
break;
case 2:
var box = Simulation.Simulation.Shapes.GetShape<Box>(index);
meshData = GetBoxVerts(box, toLeftHanded);
shapeData = GetBodyShapeData(meshData, Entity.Transform.WorldMatrix);
shapeData = GetBodyShapeData(meshData);
break;
case 3:
var triangle = Simulation.Simulation.Shapes.GetShape<Triangle>(index);
Expand All @@ -237,12 +237,12 @@ public BodyShapeData GetShapeData(TypedIndex typeIndex, bool toLeftHanded = true
case 4:
var cyliner = Simulation.Simulation.Shapes.GetShape<Cylinder>(index);
meshData = GetCylinderVerts(cyliner, toLeftHanded);
shapeData = GetBodyShapeData(meshData, Entity.Transform.WorldMatrix);
shapeData = GetBodyShapeData(meshData);
break;
#warning Same for 5,6,8
case 5:
var convex = Simulation.Simulation.Shapes.GetShape<ConvexHull>(index);
shapeData = GetConvexData(convex, Entity.Transform.WorldMatrix, toLeftHanded);
shapeData = GetConvexData(convex, toLeftHanded);
break;
case 6:
var compound = Simulation.Simulation.Shapes.GetShape<Compound>(index);
Expand All @@ -252,23 +252,20 @@ public BodyShapeData GetShapeData(TypedIndex typeIndex, bool toLeftHanded = true
throw new NotImplementedException("BigCompounds are not implemented.");
case 8:
var mesh = Simulation.Simulation.Shapes.GetShape<Mesh>(index);
shapeData = GetMeshData(mesh, Entity.Transform.WorldMatrix, toLeftHanded);
shapeData = GetMeshData(mesh, toLeftHanded);
break;
}

return shapeData;
}
private BodyShapeData GetBodyShapeData(GeometricMeshData<VertexPositionNormalTexture> meshData, Matrix objectTransform, bool toLeftHanded = true)
private BodyShapeData GetBodyShapeData(GeometricMeshData<VertexPositionNormalTexture> meshData, bool toLeftHanded = true)
{
BodyShapeData shapeData = new BodyShapeData();

// Transform box points
for (int i = 0; i < meshData.Vertices.Length; i++)
{
VertexPositionNormalTexture point = meshData.Vertices[i];
#warning TODO : no transform & set shapeData.Transform = objectTransform;
point.Position = Vector3.Transform(point.Position, objectTransform).XYZ();
shapeData.Points.Add(point.Position);
shapeData.Points.Add(meshData.Vertices[i].Position);
}

if (meshData.IsLeftHanded)
Expand Down Expand Up @@ -327,7 +324,7 @@ private GeometricMeshData<VertexPositionNormalTexture> GetCylinderVerts(Cylinder
};
return GeometricPrimitive.Cylinder.New(cylinderDescription.Height, cylinderDescription.Radius, 32, toLeftHanded: true);
}
private BodyShapeData GetConvexData(ConvexHull convex, Matrix objectTransform, bool toLeftHanded = true)
private BodyShapeData GetConvexData(ConvexHull convex, bool toLeftHanded = true)
{
//use Strides shape data
var entities = new List<Entity>();
Expand All @@ -354,7 +351,7 @@ private BodyShapeData GetConvexData(ConvexHull convex, Matrix objectTransform, b

for (int i = 0; i < shape.ConvexHulls[0][0].Count; i++)
{
shapeData.Points.Add(Vector3.Transform(shape.ConvexHulls[0][0][i], objectTransform).XYZ());
shapeData.Points.Add(shape.ConvexHulls[0][0][i]);
}

for (int i = 0; i < shape.ConvexHullsIndices[0][0].Count; i += 3)
Expand All @@ -381,7 +378,7 @@ private BodyShapeData GetCompoundData(Compound compound, bool toLeftHanded = tru

return shapeData;
}
private BodyShapeData GetMeshData(Mesh mesh, Matrix objectTransform, bool toLeftHanded = true)
private BodyShapeData GetMeshData(Mesh mesh, bool toLeftHanded = true)
{
var meshContainer = (IMeshContainerComponent)this;

Expand All @@ -394,61 +391,15 @@ private BodyShapeData GetMeshData(Mesh mesh, Matrix objectTransform, bool toLeft
var game = Services.GetService<IGame>();
BodyShapeData shapeData = GetMeshData(meshContainer.Model, game);

for (int i = 0; i < shapeData.Points.Count; i++)
{
shapeData.Points[i] = Vector3.Transform(shapeData.Points[i], objectTransform).XYZ();
}

for (int i = 0; i < shapeData.Indices.Count; i += 3)
{
// NOTE: Reversed winding to create left handed input
(shapeData.Indices[i + 1], shapeData.Indices[i + 2]) = (shapeData.Indices[i + 2], shapeData.Indices[i + 1]);
}

return shapeData;

//for(int i = 0; i < mesh.Triangles.Length; i++)
//{
// var triangle = mesh.Triangles[i];
// shapeData.Points.Add(triangle.A.ToStrideVector());
// shapeData.Points.Add(triangle.B.ToStrideVector());
// shapeData.Points.Add(triangle.C.ToStrideVector());
//
// shapeData.Indices.Add(i * 1);
// shapeData.Indices.Add(i * 2);
// shapeData.Indices.Add(i * 3);
//}

//return MergeDuplicateVerts(shapeData, objectTransform);
}

#warning @Doprez Is it needed ?
//private BodyShapeData MergeDuplicateVerts(BodyShapeData shapeData, Matrix objectTransform)
//{
// BodyShapeData newBodyShape = new BodyShapeData();

// for (int i = 0; i < shapeData.Points.Count; i++)
// {
// if (!newBodyShape.Points.Contains(shapeData.Points[i]))
// {
// newBodyShape.Points.Add(shapeData.Points[i]);
// }
// }

// for (int i = 0; i < shapeData.Indices.Count; i++)
// {
// newBodyShape.Indices.Add(newBodyShape.Points.IndexOf(shapeData.Points[shapeData.Indices[i]]));
// }

// for (int i = 0; i < shapeData.Indices.Count; i += 3)
// {
// // NOTE: Reversed winding to create left handed input
// (shapeData.Indices[i + 1], shapeData.Indices[i + 2]) = (shapeData.Indices[i + 2], shapeData.Indices[i + 1]);
// }

// return newBodyShape;
//}

private static unsafe BodyShapeData GetMeshData(Model model, IGame game)
{
BodyShapeData bodyData = new BodyShapeData();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,18 @@ public class SinglePassWireframeRenderFeature : RootRenderFeature
DynamicEffectInstance shader;
MutablePipelineState pipelineState;

/// <summary>
/// Adjust scale a bit of wireframe model to prevent z-fighting
/// </summary>
[DataMember(10)]
[DataMember(0)]
public bool Enable = true;
/// <summary>
/// Adjust scale a bit of wireframe model to prevent z-fighting
/// </summary>
[DataMember(10)]
[DataMemberRange(0.0f, 0.1f, 0.001f, 0.002f, 4)]
public float ScaleAdjust = 0.01f;
[DataMember(11)]
[DataMemberRange(0.0f, 10.0f, 0.001f, 0.002f, 4)]
public float LineWidth = 2f;


public override Type SupportedRenderObjectType => typeof(WireFrameRenderObject);

Expand Down Expand Up @@ -68,6 +74,8 @@ public override void Prepare(RenderDrawContext context)

public override void Draw(RenderDrawContext context, RenderView renderView, RenderViewStage renderViewStage)
{
if (!Enable) return;

shader.UpdateEffect(context.GraphicsDevice);

foreach (var myRenderObject in _wireframes)
Expand All @@ -76,7 +84,7 @@ public override void Draw(RenderDrawContext context, RenderView renderView, Rend
shader.Parameters.Set(TransformationKeys.WorldViewProjection, myRenderObject.WorldMatrix * renderView.ViewProjection); // matrix
shader.Parameters.Set(TransformationKeys.WorldScale, new Vector3(ScaleAdjust + 1.0f)); // increase size to avoid z-fight
shader.Parameters.Set(SinglePassWireframeShaderKeys.Viewport, new Vector4(context.RenderContext.RenderView.ViewSize, 0, 0));
shader.Parameters.Set(SinglePassWireframeShaderKeys.LineWidth, 2f);
shader.Parameters.Set(SinglePassWireframeShaderKeys.LineWidth, LineWidth);
shader.Parameters.Set(SinglePassWireframeShaderKeys.LineColor, (Vector3)myRenderObject.Color);

// prepare pipeline state
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -293,8 +293,8 @@ internal bool IsRegistered()
internal void UpdateDebugRender()
{
#warning Can't do that for now because it will apply 2 times the matrix on points.
//if (_wireFrameRenderObject != null)
// _wireFrameRenderObject.WorldMatrix = _containerComponent.Entity.Transform.WorldMatrix;
if (_wireFrameRenderObject != null)
_wireFrameRenderObject.WorldMatrix = _containerComponent.Entity.Transform.WorldMatrix;
}
private void RebuildDebugRender()
{
Expand All @@ -306,7 +306,7 @@ private void RebuildDebugRender()
_wireFrameRenderObject.Prepare(_game.GraphicsDevice, shape.Indices.ToArray(), shape.Points.Select(e => new VertexPositionNormalTexture(e, Vector3.One, Vector2.Zero)).ToArray());
_wireFrameRenderObject.Color = Color.Red;
#warning Can't do that for now because it will apply 2 times the matrix on points.
//_wireFrameRenderObject.WorldMatrix = _containerComponent.Entity.Transform.WorldMatrix;
_wireFrameRenderObject.WorldMatrix = _containerComponent.Entity.Transform.WorldMatrix;
_wireFrameRenderObject.RenderGroup = RenderGroup.Group1;

if (_visibilityGroup == null)
Expand Down

0 comments on commit ce4b090

Please sign in to comment.