Fix rail button screw normals
This commit is contained in:
parent
7ebed840b6
commit
2ac695955e
@ -51,18 +51,19 @@ public class RailButtonExporter extends RocketComponentExporter<RailButton> {
|
||||
float screwHeight, InstanceContext context) {
|
||||
final int startIdx = obj.getNumVertices();
|
||||
final int normalStartIdx = obj.getNumNormals();
|
||||
final int nrOfSides = LOD.getNrOfSides(outerRadius);
|
||||
|
||||
// Generate base cylinder
|
||||
List<Integer> baseCylinderForeVertices = new ArrayList<>();
|
||||
List<Integer> baseCylinderAftVertices = new ArrayList<>();
|
||||
CylinderExporter.addCylinderMesh(obj, transformer, null, outerRadius, baseHeight, false, LOD,
|
||||
CylinderExporter.addCylinderMesh(obj, transformer, null, outerRadius, baseHeight, false, nrOfSides,
|
||||
baseCylinderForeVertices, baseCylinderAftVertices);
|
||||
|
||||
// Generate inner cylinder
|
||||
int tmpStartIdx = obj.getNumVertices();
|
||||
List<Integer> innerCylinderForeVertices = new ArrayList<>();
|
||||
List<Integer> innerCylinderAftVertices = new ArrayList<>();
|
||||
CylinderExporter.addCylinderMesh(obj, transformer, null, innerRadius, innerHeight, false, LOD,
|
||||
CylinderExporter.addCylinderMesh(obj, transformer, null, innerRadius, innerHeight, false, nrOfSides,
|
||||
innerCylinderForeVertices, innerCylinderAftVertices);
|
||||
int tmpEndIdx = Math.max(obj.getNumVertices() - 1, tmpStartIdx);
|
||||
FloatTuple locOffs = transformer.convertLocWithoutOriginOffs(baseHeight, 0, 0);
|
||||
@ -72,8 +73,9 @@ public class RailButtonExporter extends RocketComponentExporter<RailButton> {
|
||||
tmpStartIdx = obj.getNumVertices();
|
||||
List<Integer> flangeCylinderForeVertices = new ArrayList<>();
|
||||
List<Integer> flangeCylinderAftVertices = new ArrayList<>();
|
||||
CylinderExporter.addCylinderMesh(obj, transformer, null, outerRadius, flangeHeight, false, LOD,
|
||||
flangeCylinderForeVertices, flangeCylinderAftVertices);
|
||||
List<Integer> flangeCylinderAftNormals = new ArrayList<>();
|
||||
CylinderExporter.addCylinderMesh(obj, transformer, null, outerRadius, outerRadius, flangeHeight, nrOfSides,
|
||||
false, true, flangeCylinderForeVertices, flangeCylinderAftVertices, null, flangeCylinderAftNormals);
|
||||
tmpEndIdx = Math.max(obj.getNumVertices() - 1, tmpStartIdx);
|
||||
locOffs = transformer.convertLocWithoutOriginOffs(baseHeight + innerHeight, 0, 0);
|
||||
ObjUtils.translateVertices(obj, tmpStartIdx, tmpEndIdx, locOffs.getX(), locOffs.getY(), locOffs.getZ());
|
||||
@ -91,7 +93,8 @@ public class RailButtonExporter extends RocketComponentExporter<RailButton> {
|
||||
if (Float.compare(screwHeight, 0) == 0) {
|
||||
DiskExporter.closeDiskMesh(obj, transformer, null, flangeCylinderAftVertices, false, false);
|
||||
} else {
|
||||
addScrew(obj, baseHeight, innerHeight, flangeHeight, outerRadius, screwHeight, LOD, flangeCylinderAftVertices);
|
||||
addScrew(obj, baseHeight, innerHeight, flangeHeight, outerRadius, screwHeight, LOD,
|
||||
flangeCylinderAftVertices, flangeCylinderAftNormals);
|
||||
}
|
||||
|
||||
|
||||
@ -123,15 +126,20 @@ public class RailButtonExporter extends RocketComponentExporter<RailButton> {
|
||||
}
|
||||
|
||||
private void addScrew(DefaultObj obj, float baseHeight, float innerHeight, float flangeHeight, float outerRadius,
|
||||
float screwHeight, ObjUtils.LevelOfDetail LOD, List<Integer> flangeCylinderTopVertices) {
|
||||
float screwHeight, ObjUtils.LevelOfDetail LOD,
|
||||
List<Integer> flangeCylinderAftVertices, List<Integer> flangeCylinderAftNormals) {
|
||||
final int nrOfStacks = LOD.getValue() / 10;
|
||||
final int nrOfSlices = flangeCylinderTopVertices.size();
|
||||
final int nrOfSlices = flangeCylinderAftVertices.size();
|
||||
final int startIdx = obj.getNumVertices();
|
||||
final int normalStartIdx = obj.getNumNormals();
|
||||
final float buttonHeight = baseHeight + innerHeight + flangeHeight;
|
||||
|
||||
final float centerX = buttonHeight;
|
||||
|
||||
if (flangeCylinderAftNormals.size() != nrOfSlices) {
|
||||
throw new IllegalArgumentException("The number of normals must be equal to the number of slices");
|
||||
}
|
||||
|
||||
// Generate the mesh vertices (no tip)
|
||||
for (int i = 1; i <= nrOfStacks-1; i++) {
|
||||
for (int j = 0; j < nrOfSlices; j++) {
|
||||
@ -158,16 +166,16 @@ public class RailButtonExporter extends RocketComponentExporter<RailButton> {
|
||||
for (int i = 0; i < nrOfSlices; i++) {
|
||||
int nextIdx = (i + 1) % nrOfSlices;
|
||||
int[] vertexIndices = new int[] {
|
||||
flangeCylinderTopVertices.get(i), // Bottom-left of quad
|
||||
flangeCylinderAftVertices.get(i), // Bottom-left of quad
|
||||
startIdx + i, // Top-left of quad
|
||||
startIdx + nextIdx, // Top-right of quad
|
||||
flangeCylinderTopVertices.get(nextIdx), // Bottom-right of quad
|
||||
flangeCylinderAftVertices.get(nextIdx), // Bottom-right of quad
|
||||
};
|
||||
int[] normalIndices = new int[] {
|
||||
flangeCylinderTopVertices.get(i), // Bottom-left of quad
|
||||
flangeCylinderAftNormals.get(i), // Bottom-left of quad
|
||||
normalStartIdx + i, // Top-left of quad
|
||||
normalStartIdx + nextIdx, // Top-right of quad
|
||||
flangeCylinderTopVertices.get(nextIdx), // Bottom-right of quad
|
||||
flangeCylinderAftNormals.get(nextIdx), // Bottom-right of quad
|
||||
};
|
||||
|
||||
// No need to offset! We already directly reference the indices
|
||||
|
@ -24,10 +24,13 @@ public class CylinderExporter {
|
||||
* @param isOutside Whether the cylinder is an outside face (true) or inside face (false)
|
||||
* @param foreRingVertices A list to add the fore (top) ring vertex indices to
|
||||
* @param aftRingVertices A list to add the aft (bottom) ring vertex indices to
|
||||
* @param foreRingNormals A list to add the fore (top) ring normal indices to
|
||||
* @param aftRingNormals A list to add the aft (bottom) ring normal indices to
|
||||
*/
|
||||
public static void addCylinderMesh(@NotNull DefaultObj obj, @NotNull CoordTransform transformer, String groupName,
|
||||
float foreRadius, float aftRadius, float length, int numSides, boolean solid, boolean isOutside,
|
||||
List<Integer> foreRingVertices, List<Integer> aftRingVertices) {
|
||||
List<Integer> foreRingVertices, List<Integer> aftRingVertices,
|
||||
List<Integer> foreRingNormals, List<Integer> aftRingNormals) {
|
||||
// Set the new group
|
||||
if (groupName != null) {
|
||||
obj.setActiveGroupNames(groupName);
|
||||
@ -48,10 +51,10 @@ public class CylinderExporter {
|
||||
}
|
||||
|
||||
// Generate side top vertices
|
||||
generateRingVertices(obj, transformer, startIdx, numSides, 0, foreRadius, isOutside, foreRingVertices);
|
||||
generateRingVertices(obj, transformer, numSides, 0, foreRadius, isOutside, foreRingVertices, foreRingNormals);
|
||||
|
||||
// Generate side bottom vertices
|
||||
generateRingVertices(obj, transformer, startIdx + numSides, numSides, length, aftRadius, isOutside, aftRingVertices);
|
||||
generateRingVertices(obj, transformer, numSides, length, aftRadius, isOutside, aftRingVertices, aftRingNormals);
|
||||
|
||||
// Create faces for the bottom and top
|
||||
if (solid) {
|
||||
@ -112,6 +115,13 @@ public class CylinderExporter {
|
||||
}
|
||||
}
|
||||
|
||||
public static void addCylinderMesh(@NotNull DefaultObj obj, @NotNull CoordTransform transformer, String groupName,
|
||||
float foreRadius, float aftRadius, float length, int numSides, boolean solid, boolean isOutside,
|
||||
List<Integer> foreRingVertices, List<Integer> aftRingVertices) {
|
||||
addCylinderMesh(obj, transformer, groupName, foreRadius, aftRadius, length, numSides, solid, isOutside,
|
||||
foreRingVertices, aftRingVertices, null, null);
|
||||
}
|
||||
|
||||
public static void addCylinderMesh(@NotNull DefaultObj obj, @NotNull CoordTransform transformer, String groupName,
|
||||
float radius, float length, int numSides, boolean solid, boolean isOutside,
|
||||
List<Integer> foreRingVertices, List<Integer> aftRingVertices) {
|
||||
@ -142,14 +152,12 @@ public class CylinderExporter {
|
||||
addCylinderMesh(obj, transformer, groupName, radius, height, nrOfSlices, solid, foreRingVertices, aftRingVertices);
|
||||
}
|
||||
|
||||
public static void addCylinderMesh(@NotNull DefaultObj obj, @NotNull CoordTransform transformer, String groupName,
|
||||
float radius, float height, boolean solid, ObjUtils.LevelOfDetail LOD) {
|
||||
addCylinderMesh(obj, transformer, groupName, radius, height, LOD.getNrOfSides(radius), solid, null, null);
|
||||
}
|
||||
|
||||
public static void generateRingVertices(DefaultObj obj, CoordTransform transformer, int startIdx,
|
||||
public static void generateRingVertices(DefaultObj obj, CoordTransform transformer,
|
||||
int numSides, float x, float radius, boolean isOutside,
|
||||
List<Integer> vertexList) {
|
||||
List<Integer> vertexList, List<Integer> normalList) {
|
||||
int startIdx = obj.getNumVertices();
|
||||
int normalsStartIdx = obj.getNumNormals();
|
||||
|
||||
for (int i = 0; i < numSides; i++) {
|
||||
final double angle = 2 * Math.PI * i / numSides;
|
||||
final float y = radius * (float) Math.cos(angle);
|
||||
@ -162,6 +170,9 @@ public class CylinderExporter {
|
||||
if (vertexList != null) {
|
||||
vertexList.add(startIdx + i);
|
||||
}
|
||||
if (normalList != null) {
|
||||
normalList.add(normalsStartIdx + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user