@@ -75,7 +75,9 @@ public Map<BlockPos, OreBlockPlacer> generate(WorldGenLevel level, RandomSource
7575 if (patternPool .isEmpty ())
7676 return Map .of ();
7777
78- GTLayerPattern layerPattern = patternPool .get (random .nextInt (patternPool .size ()));
78+ // minor optimization, usually only one layer pool exists
79+ GTLayerPattern layerPattern = patternPool .size () == 1 ?
80+ patternPool .get (0 ) : patternPool .get (random .nextInt (patternPool .size ()));
7981
8082 int size = entry .clusterSize ().sample (random );
8183 float density = entry .density ();
@@ -101,37 +103,54 @@ public Map<BlockPos, OreBlockPlacer> generate(WorldGenLevel level, RandomSource
101103
102104 for (int xOffset = 0 ; xOffset < width ; xOffset ++) {
103105 float sizeFractionX = xOffset * 2f / width - 1 ;
104- if ((sizeFractionX * sizeFractionX ) > 1 )
106+ float xSizeSqr = sizeFractionX * sizeFractionX ;
107+ if (xSizeSqr > 1 )
105108 continue ;
106109
107110 for (int yOffset = 0 ; yOffset < height ; yOffset ++) {
108111 float sizeFractionY = yOffset * 2f / height - 1 ;
109- if ((sizeFractionX * sizeFractionX ) + (sizeFractionY * sizeFractionY ) > 1 )
112+ float ySizeSqr = sizeFractionY * sizeFractionY ;
113+ if (xSizeSqr + ySizeSqr > 1 )
110114 continue ;
111115 if (level .isOutsideBuildHeight (yMin + yOffset ))
112116 continue ;
113117
114118 for (int zOffset = 0 ; zOffset < length ; zOffset ++) {
115119 float sizeFractionZ = zOffset * 2f / length - 1 ;
120+ float zSizeSqr = sizeFractionZ * sizeFractionZ ;
121+ // OPTIMIZATION: all values in layerDiameterOffsets are in the [0,1] range, so
122+ // check if the size is >1 before doing any of that math
123+ if (xSizeSqr + ySizeSqr + zSizeSqr > 1 )
124+ continue ;
116125
117126 int layerIndex = layerCoordinate == 0 ? zOffset : layerCoordinate == 1 ? xOffset : yOffset ;
118- if (slantyCoordinate != layerCoordinate )
127+ if (slantyCoordinate != layerCoordinate ) {
119128 layerIndex += Mth .floor (
120129 slantyCoordinate == 0 ? zOffset : slantyCoordinate == 1 ? xOffset : yOffset ) * slope ;
130+ }
121131
122132 while (layerIndex >= resolvedLayers .size ()) {
123133 GTLayerPattern .Layer next = layerPattern .rollNext (
124134 resolvedLayers .isEmpty () ? null : resolvedLayers .get (resolvedLayers .size () - 1 ),
125135 random );
126- float offset = random .nextFloat () * .5f + .5f ;
136+
137+ float offset = random .nextFloat () * 0.5f + 0.5f ;
138+ // insert the previous layer if this one is null (e.g. invalid)
139+ if (next == null ) {
140+ if (resolvedLayers .isEmpty ()) {
141+ continue ;
142+ }
143+ resolvedLayers .add (resolvedLayers .get (resolvedLayers .size () - 1 ));
144+ layerDiameterOffsets .add (offset );
145+ continue ;
146+ }
127147 for (int i = 0 ; i < next .minSize + random .nextInt (1 + next .maxSize - next .minSize ); i ++) {
128148 resolvedLayers .add (next );
129149 layerDiameterOffsets .add (offset );
130150 }
131151 }
132152
133- if ((sizeFractionX * sizeFractionX ) + (sizeFractionY * sizeFractionY ) +
134- (sizeFractionZ * sizeFractionZ ) > 1 * layerDiameterOffsets .getFloat (layerIndex ))
153+ if (xSizeSqr + ySizeSqr + zSizeSqr > layerDiameterOffsets .getFloat (layerIndex ))
135154 continue ;
136155
137156 GTLayerPattern .Layer layer = resolvedLayers .get (layerIndex );
0 commit comments