Fix shoulder inner mesh start locations
This commit is contained in:
parent
10c495ce5b
commit
765c6cde63
@ -106,14 +106,14 @@ public class TransitionExporter extends RocketComponentExporter<Transition> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a transition mesh to the obj.
|
* Add a transition mesh to the obj.
|
||||||
* @param numSlices the number of slices to use (= number of vertices in the circumferential direction)
|
* @param numSides the number of sides to use (= number of vertices in the circumferential direction)
|
||||||
* @param numStacks the number of stacks to use (= number of vertices in the longitudinal direction)
|
* @param numStacks the number of stacks to use (= number of vertices in the longitudinal direction)
|
||||||
* @param offsetRadius offset radius from the transition radius
|
* @param offsetRadius offset radius from the transition radius
|
||||||
* @param isOutside true if the mesh is on the outside of the rocket, false if it is on the inside
|
* @param isOutside true if the mesh is on the outside of the rocket, false if it is on the inside
|
||||||
* @param foreRingVertices list of vertices of the fore ring
|
* @param foreRingVertices list of vertices of the fore ring
|
||||||
* @param aftRingVertices list of vertices of the aft ring
|
* @param aftRingVertices list of vertices of the aft ring
|
||||||
*/
|
*/
|
||||||
private void addTransitionMesh(int numSlices, int numStacks, double offsetRadius, boolean isOutside,
|
private void addTransitionMesh(int numSides, int numStacks, double offsetRadius, boolean isOutside,
|
||||||
List<Integer> foreRingVertices, List<Integer> aftRingVertices,
|
List<Integer> foreRingVertices, List<Integer> aftRingVertices,
|
||||||
boolean hasForeShoulder, boolean hasAftShoulder) {
|
boolean hasForeShoulder, boolean hasAftShoulder) {
|
||||||
// Other meshes may have been added to the obj, so we need to keep track of the starting indices
|
// Other meshes may have been added to the obj, so we need to keep track of the starting indices
|
||||||
@ -124,14 +124,16 @@ public class TransitionExporter extends RocketComponentExporter<Transition> {
|
|||||||
final double actualLength = estimateActualLength(offsetRadius, dxBase); // Actual length of the transition (due to reduced step size near the fore/aft end)
|
final double actualLength = estimateActualLength(offsetRadius, dxBase); // Actual length of the transition (due to reduced step size near the fore/aft end)
|
||||||
|
|
||||||
// Get the location where the fore/aft shoulder would end (due to its thickness)
|
// Get the location where the fore/aft shoulder would end (due to its thickness)
|
||||||
final double xForeShoulder = component.getAftShoulderThickness();
|
final double xForeShoulder = component.getForeShoulderThickness();
|
||||||
final double xAftShoulder = component.getLength() - component.getForeShoulderThickness();
|
final double xAftShoulder = component.getLength() - component.getAftShoulderThickness();
|
||||||
|
|
||||||
// Generate vertices and normals
|
// Generate vertices and normals
|
||||||
float x = 0; // Distance from the fore end
|
float x = 0; // Distance from the fore end
|
||||||
double r; // Current radius at location x
|
double r; // Current radius at location x
|
||||||
boolean isForeTip = false; // True if the fore end of the transition is a tip (radius = 0)
|
boolean isForeTip = false; // True if the fore end of the transition is a tip (radius = 0)
|
||||||
|
boolean isForeRing = false; // True if the current ring is the first fore ring
|
||||||
boolean isAftTip = false; // True if the aft end of the transition is a tip (radius = 0)
|
boolean isAftTip = false; // True if the aft end of the transition is a tip (radius = 0)
|
||||||
|
boolean isAftRing = false; // True if the current ring is the last aft ring
|
||||||
int actualNumStacks = 0; // Number of stacks added, deviates from set point due to reduced step size near the tip (does not include aft/fore tip rings)
|
int actualNumStacks = 0; // Number of stacks added, deviates from set point due to reduced step size near the tip (does not include aft/fore tip rings)
|
||||||
while (x <= (float) component.getLength()) {
|
while (x <= (float) component.getLength()) {
|
||||||
// When closer to the smallest section of the transition, decrease the step size
|
// When closer to the smallest section of the transition, decrease the step size
|
||||||
@ -190,9 +192,9 @@ public class TransitionExporter extends RocketComponentExporter<Transition> {
|
|||||||
if (!isOutside) {
|
if (!isOutside) {
|
||||||
if (hasForeShoulder && x < xForeShoulder) {
|
if (hasForeShoulder && x < xForeShoulder) {
|
||||||
// If the current ring is before the fore shoulder ring and the next ring is after, clamp the
|
// If the current ring is before the fore shoulder ring and the next ring is after, clamp the
|
||||||
// next ring to the fore shoulder ring
|
// current ring to the fore shoulder ring
|
||||||
if (xNext > xForeShoulder) {
|
if (xNext > xForeShoulder) {
|
||||||
xNext = (float) xForeShoulder;
|
x = (float) xForeShoulder;
|
||||||
} else {
|
} else {
|
||||||
// Skip the ring
|
// Skip the ring
|
||||||
x = xNext;
|
x = xNext;
|
||||||
@ -208,6 +210,8 @@ public class TransitionExporter extends RocketComponentExporter<Transition> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the current radius is larger than 0, and the next radius is (approximately) a tip,
|
||||||
|
// and you're not yet at the aft end, add the aft tip vertex
|
||||||
if (Double.compare(rNext, RADIUS_EPSILON) <= 0 && Double.compare(x, component.getLength()) != 0) {
|
if (Double.compare(rNext, RADIUS_EPSILON) <= 0 && Double.compare(x, component.getLength()) != 0) {
|
||||||
// Case 3: Add a single vertex at the center at the next x position (= aft tip)
|
// Case 3: Add a single vertex at the center at the next x position (= aft tip)
|
||||||
float epsilon = dx / 20;
|
float epsilon = dx / 20;
|
||||||
@ -222,17 +226,17 @@ public class TransitionExporter extends RocketComponentExporter<Transition> {
|
|||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
// Check on which ring we are
|
// Check on which ring we are
|
||||||
boolean isForeRing = actualNumStacks == 0 && foreRingVertices.isEmpty();
|
isForeRing = actualNumStacks == 0 && foreRingVertices.isEmpty();
|
||||||
boolean isAftRing = Double.compare(x, (float) component.getLength()) == 0;
|
isAftRing = Float.compare(x, (float) component.getLength()) == 0 || Float.compare(x, (float) xAftShoulder) >= 0;
|
||||||
|
|
||||||
// Case 5: Add normal vertices
|
// Case 5: Add normal vertices
|
||||||
addQuadVertices(numSlices, foreRingVertices, aftRingVertices, r, rNext, x, xNext, isForeRing, isAftRing, isOutside);
|
addQuadVertices(numSides, foreRingVertices, aftRingVertices, r, rNext, x, xNext, isForeRing, isAftRing, isOutside);
|
||||||
actualNumStacks++;
|
actualNumStacks++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we're at the aft end or aft shoulder, stop
|
// If we're at the aft end or aft shoulder, stop
|
||||||
if (Float.compare(x, (float) component.getLength()) == 0 || Float.compare(x, (float) xAftShoulder) >= 0) {
|
if (isAftRing) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -241,7 +245,7 @@ public class TransitionExporter extends RocketComponentExporter<Transition> {
|
|||||||
|
|
||||||
// Create aft/fore tip faces
|
// Create aft/fore tip faces
|
||||||
if (isAftTip || isForeTip) {
|
if (isAftTip || isForeTip) {
|
||||||
addTipFaces(numSlices, isOutside, isForeTip, startIdx, normalsStartIdx);
|
addTipFaces(numSides, isOutside, isForeTip, startIdx, normalsStartIdx, texCoordsStartIdx);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create regular faces
|
// Create regular faces
|
||||||
|
Loading…
x
Reference in New Issue
Block a user