@@ -60,9 +60,48 @@ public class ExportDataManager extends ProgressReporter {
60
60
// whether to fix tjunction problems
61
61
private final boolean fixTJunctions ;
62
62
63
- // center of this object
63
+ // center of all voxels
64
64
private final float [] center ;
65
65
66
+ // centers of individual objects
67
+ private final ArrayList <float []> centers = new ArrayList <>();
68
+
69
+ // retrieve offsets
70
+ public final float [][] getOffsets () {
71
+ float [][] result = new float [centers .size ()][];
72
+ for (int i = 0 ; i < result .length ; i ++) {
73
+ result [i ] = centers .get (i ).clone ();
74
+ float [] entry = result [i ];
75
+ switch (originMode ) {
76
+ case ColladaExportWrapper .ORIGIN_CENTER :
77
+ entry [0 ] -= center [0 ];
78
+ entry [1 ] -= center [1 ];
79
+ entry [2 ] -= center [2 ];
80
+ break ;
81
+ case ColladaExportWrapper .ORIGIN_PLANE_CENTER :
82
+ entry [0 ] -= center [0 ];
83
+ entry [1 ] -= 0.5f ;
84
+ entry [2 ] -= center [2 ];
85
+ break ;
86
+ case ColladaExportWrapper .ORIGIN_BOX_CENTER :
87
+ entry [0 ] -= DynamicSettings .VOXEL_PLANE_SIZE_X % 2 == 0 ? -0.5f : 0f ;
88
+ entry [1 ] -= 0.5f - DynamicSettings .VOXEL_PLANE_RANGE_Y ;
89
+ entry [2 ] -= DynamicSettings .VOXEL_PLANE_SIZE_Z % 2 == 0 ? -0.5f : 0f ;
90
+ break ;
91
+ case ColladaExportWrapper .ORIGIN_BOX_PLANE_CENTER :
92
+ entry [0 ] -= DynamicSettings .VOXEL_PLANE_SIZE_X % 2 == 0 ? -0.5f : 0f ;
93
+ entry [1 ] -= 0.5f ;
94
+ entry [2 ] -= DynamicSettings .VOXEL_PLANE_SIZE_Z % 2 == 0 ? -0.5f : 0f ;
95
+ break ;
96
+ case ColladaExportWrapper .ORIGIN_CROSS :
97
+ default :
98
+ break ;
99
+ }
100
+ }
101
+
102
+ return result ;
103
+ }
104
+
66
105
// -------------
67
106
// Layer names of layers that are being exported
68
107
private final ArrayList <String > layerNames = new ArrayList <String >();
@@ -101,26 +140,46 @@ public final TriTextureManager getTextureManager() {
101
140
102
141
// constructor
103
142
public ExportDataManager (ProgressDialog dialog , ConsoleInterface console , Data data , boolean usePadding , boolean removeHoles , int algorithm , boolean useYUP ,
104
- int originMode , boolean forcePOT , boolean useLayers , boolean triangulateByColor , boolean useVertexColoring , boolean fixTJunctions ,
143
+ int originMode , boolean forcePOT , int separationMode , boolean triangulateByColor , boolean useVertexColoring , boolean fixTJunctions ,
105
144
boolean exportTexturedVoxels , boolean useOverlappingUvs , boolean useSkewedUvs ) {
106
145
super (dialog , console );
107
146
108
147
// create hull manager that exposes hull information
109
148
setActivity ("Computing Hull..." , true );
110
- int minx = Integer .MAX_VALUE ;
111
- int maxx = Integer .MIN_VALUE ;
112
- int miny = Integer .MAX_VALUE ;
113
- int maxy = Integer .MIN_VALUE ;
114
- int minz = Integer .MAX_VALUE ;
115
- int maxz = Integer .MIN_VALUE ;
116
-
117
- if (useLayers ) {
149
+ int gminx = Integer .MAX_VALUE ;
150
+ int gmaxx = Integer .MIN_VALUE ;
151
+ int gminy = Integer .MAX_VALUE ;
152
+ int gmaxy = Integer .MIN_VALUE ;
153
+ int gminz = Integer .MAX_VALUE ;
154
+ int gmaxz = Integer .MIN_VALUE ;
155
+ if (separationMode == ColladaExportWrapper .SEPARATION_VOXEL ) {
156
+ // handle voxels separately
157
+ for (Voxel voxel : data .getVisibleLayerVoxel ()) {
158
+ HullManagerExt <Voxel > hullManager = new HullManagerExt <>();
159
+ hullManager .update (voxel .posId , voxel );
160
+ hullManagers .add (hullManager );
161
+ layerNames .add ("voxel_" + voxel .x + "_" + voxel .y + "_" + voxel .z );
162
+ centers .add (new float [] {voxel .x , voxel .y , voxel .z });
163
+ gminx = Math .min (gminx , voxel .x );
164
+ gmaxx = Math .max (gmaxx , voxel .x );
165
+ gminy = Math .min (gminy , voxel .y );
166
+ gmaxy = Math .max (gmaxy , voxel .y );
167
+ gminz = Math .min (gminz , voxel .z );
168
+ gmaxz = Math .max (gmaxz , voxel .z );
169
+ }
170
+ } else if (separationMode == ColladaExportWrapper .SEPARATION_LAYER ) {
118
171
// handle layers separately
119
172
for (Integer layerId : data .getLayers ()) {
120
173
if (data .getLayerVisible (layerId )) {
121
174
Voxel [] layerVoxel = data .getLayerVoxels (layerId );
122
175
if (layerVoxel .length != 0 ) {
123
- HullManagerExt <Voxel > hullManager = new HullManagerExt <Voxel >();
176
+ HullManagerExt <Voxel > hullManager = new HullManagerExt <>();
177
+ int minx = Integer .MAX_VALUE ;
178
+ int maxx = Integer .MIN_VALUE ;
179
+ int miny = Integer .MAX_VALUE ;
180
+ int maxy = Integer .MIN_VALUE ;
181
+ int minz = Integer .MAX_VALUE ;
182
+ int maxz = Integer .MIN_VALUE ;
124
183
for (Voxel voxel : data .getLayerVoxels (layerId )) {
125
184
hullManager .update (voxel .posId , voxel );
126
185
minx = Math .min (minx , voxel .x );
@@ -132,12 +191,25 @@ public ExportDataManager(ProgressDialog dialog, ConsoleInterface console, Data d
132
191
}
133
192
layerNames .add (data .getLayerName (layerId ));
134
193
hullManagers .add (hullManager );
194
+ centers .add (new float [] {(minx + maxx ) / 2f , (miny + maxy ) / 2f , (minz + maxz ) / 2f });
195
+ gminx = Math .min (gminx , minx );
196
+ gmaxx = Math .max (gmaxx , maxx );
197
+ gminy = Math .min (gminy , miny );
198
+ gmaxy = Math .max (gmaxy , maxy );
199
+ gminz = Math .min (gminz , minz );
200
+ gmaxz = Math .max (gmaxz , maxz );
135
201
}
136
202
}
137
203
}
138
- } else {
204
+ } else if ( separationMode == ColladaExportWrapper . SEPARATION_MERGED ) {
139
205
// merge all layers
140
- HullManagerExt <Voxel > hullManager = new HullManagerExt <Voxel >();
206
+ HullManagerExt <Voxel > hullManager = new HullManagerExt <>();
207
+ int minx = Integer .MAX_VALUE ;
208
+ int maxx = Integer .MIN_VALUE ;
209
+ int miny = Integer .MAX_VALUE ;
210
+ int maxy = Integer .MIN_VALUE ;
211
+ int minz = Integer .MAX_VALUE ;
212
+ int maxz = Integer .MIN_VALUE ;
141
213
for (Voxel voxel : data .getVisibleLayerVoxel ()) {
142
214
hullManager .update (voxel .posId , voxel );
143
215
minx = Math .min (minx , voxel .x );
@@ -149,11 +221,18 @@ public ExportDataManager(ProgressDialog dialog, ConsoleInterface console, Data d
149
221
}
150
222
layerNames .add ("Merged" );
151
223
hullManagers .add (hullManager );
224
+ centers .add (new float [] {(minx + maxx ) / 2f , (miny + maxy ) / 2f , (minz + maxz ) / 2f });
225
+ gminx = Math .min (gminx , minx );
226
+ gmaxx = Math .max (gmaxx , maxx );
227
+ gminy = Math .min (gminy , miny );
228
+ gmaxy = Math .max (gmaxy , maxy );
229
+ gminz = Math .min (gminz , minz );
230
+ gmaxz = Math .max (gmaxz , maxz );
152
231
}
153
232
center = new float [] {
154
- (minx + maxx ) / 2f ,
155
- (miny + maxy ) / 2f ,
156
- (minz + maxz ) / 2f
233
+ (gminx + gmaxx ) / 2f ,
234
+ (gminy + gmaxy ) / 2f ,
235
+ (gminz + gmaxz ) / 2f
157
236
};
158
237
159
238
// store references
@@ -308,8 +387,10 @@ private short[][][] fix3DTJunctionProblems(HullManagerExt<Voxel> hullManager, sh
308
387
private void extract (final int algorithm ) {
309
388
setActivity ("Extracting Mesh..." , false );
310
389
// loop over all managers
311
- for (final HullManagerExt <Voxel > hullManager : hullManagers ) {
312
- final TexTriangleManager triangleManager = new TexTriangleManager ();
390
+ for (int i = 0 ; i < hullManagers .size (); i ++) {
391
+ final int finalI = i ;
392
+ HullManagerExt <Voxel > hullManager = hullManagers .get (i );
393
+ final TexTriangleManager triangleManager = new TexTriangleManager ();
313
394
triangleManagers .add (triangleManager );
314
395
// loop over all sides
315
396
for (int side = 0 ; side < 6 ; side ++) {
@@ -487,25 +568,7 @@ public boolean execute(int rgb, Collection<DelaunayTriangle> tris) {
487
568
texTri .invert (1 );
488
569
texTri .invert (2 );
489
570
490
- if (originMode == ColladaExportWrapper .ORIGIN_CROSS ) {
491
- texTri .move (0.5f , 0.5f , 0.5f ); // move one up
492
- } else if (originMode == ColladaExportWrapper .ORIGIN_CENTER ) {
493
- texTri .move (center [0 ] + 0.5f , center [2 ] + 0.5f , center [1 ] + 0.5f );
494
- } else if (originMode == ColladaExportWrapper .ORIGIN_PLANE_CENTER ) {
495
- texTri .move (center [0 ] + 0.5f , center [2 ] + 0.5f , 1f );
496
- } else if (originMode == ColladaExportWrapper .ORIGIN_BOX_CENTER ) {
497
- texTri .move (
498
- DynamicSettings .VOXEL_PLANE_SIZE_X % 2 == 0 ? 0f : 0.5f ,
499
- DynamicSettings .VOXEL_PLANE_SIZE_Z % 2 == 0 ? 0f : 0.5f ,
500
- 1f - DynamicSettings .VOXEL_PLANE_RANGE_Y
501
- );
502
- } else if (originMode == ColladaExportWrapper .ORIGIN_BOX_PLANE_CENTER ) {
503
- texTri .move (
504
- DynamicSettings .VOXEL_PLANE_SIZE_X % 2 == 0 ? 0f : 0.5f ,
505
- DynamicSettings .VOXEL_PLANE_SIZE_Z % 2 == 0 ? 0f : 0.5f ,
506
- 1f
507
- );
508
- }
571
+ texTri .move (centers .get (finalI )[0 ] + 0.5f , centers .get (finalI )[2 ] + 0.5f , centers .get (finalI )[1 ] + 0.5f );
509
572
510
573
if (useYUP ) {
511
574
texTri .swap (1 , 2 );
0 commit comments