Skip to content

New uvmap for MeshDraft.Prism #67

@BasmanovDaniil

Description

@BasmanovDaniil

Prism (on the right) should have the same uvmap as Cylinder (on the left).
image

public static MeshDraft Prism(float radius, int segments, float height, bool generateUV = true)
{
float segmentAngle = 360f/segments;
float currentAngle = 0;
Vector3 halfHeightUp = Vector3.up*height/2;
var lowerRing = new List<Vector3>(segments);
var lowerDiskUV = new List<Vector2>();
var upperRing = new List<Vector3>(segments);
var upperDiskUV = new List<Vector2>();
for (var i = 0; i < segments; i++)
{
var point = Geometry.PointOnCircle3XZ(radius, currentAngle);
lowerRing.Add(point - halfHeightUp);
upperRing.Add(point + halfHeightUp);
if (generateUV)
{
Vector2 uv = Geometry.PointOnCircle2(0.5f, currentAngle) + new Vector2(0.5f, 0.5f);
upperDiskUV.Add(uv);
uv.x = 1 - uv.x;
lowerDiskUV.Add(uv);
}
currentAngle += segmentAngle;
}
var draft = new MeshDraft {name = "Prism"}
.AddFlatQuadBand(lowerRing, upperRing, generateUV);
if (generateUV)
{
draft.AddTriangleFan(upperRing, Vector3.up, upperDiskUV)
.AddTriangleFan(lowerRing, Vector3.down, lowerDiskUV, true);
}
else
{
draft.AddTriangleFan(upperRing, Vector3.up)
.AddTriangleFan(lowerRing, Vector3.down, true);
}
return draft;
}

public static MeshDraft Cylinder(float radius, int segments, float height, bool generateUV = true)
{
float segmentAngle = 360f/segments;
float currentAngle = 0;
Vector3 halfHeightUp = Vector3.up*height/2;
var draft = new MeshDraft {name = "Cylinder"};
var lowerRing = new List<Vector3>(segments);
var lowerDiskUV = new List<Vector2>();
var upperRing = new List<Vector3>(segments);
var upperDiskUV = new List<Vector2>();
var strip = new List<Vector3>();
var stripNormals = new List<Vector3>();
var stripUV = new List<Vector2>();
for (var i = 0; i < segments; i++)
{
AddCylinderPoints(radius, currentAngle, halfHeightUp, generateUV,
ref strip, ref stripUV, ref stripNormals, out Vector3 lowerVertex, out Vector3 upperVertex);
lowerRing.Add(lowerVertex);
upperRing.Add(upperVertex);
if (generateUV)
{
Vector2 uv = Geometry.PointOnCircle2(0.5f, currentAngle) + new Vector2(0.5f, 0.5f);
upperDiskUV.Add(uv);
uv.x = 1 - uv.x;
lowerDiskUV.Add(uv);
}
currentAngle += segmentAngle;
}
AddCylinderPoints(radius, currentAngle, halfHeightUp, generateUV,
ref strip, ref stripUV, ref stripNormals, out _, out _);
if (generateUV)
{
draft.AddTriangleFan(lowerRing, Vector3.down, lowerDiskUV, true);
draft.AddTriangleFan(upperRing, Vector3.up, upperDiskUV);
draft.AddTriangleStrip(strip, stripNormals, stripUV);
}
else
{
draft.AddTriangleFan(lowerRing, Vector3.down, true);
draft.AddTriangleFan(upperRing, Vector3.up);
draft.AddTriangleStrip(strip, stripNormals);
}
return draft;
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions