Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
I
imagej-elphel
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
3
Issues
3
List
Board
Labels
Milestones
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Elphel
imagej-elphel
Commits
5ae26946
Commit
5ae26946
authored
Dec 23, 2022
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
COnverted to opaque gltf (alpha blend did not work correctly),
consolidated image textures in gltf.
parent
2408288a
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
68 additions
and
38 deletions
+68
-38
CLTParameters.java
src/main/java/com/elphel/imagej/cameras/CLTParameters.java
+5
-0
TexturedModel.java
...n/java/com/elphel/imagej/tileprocessor/TexturedModel.java
+5
-3
GlTfExport.java
src/main/java/com/elphel/imagej/x3d/export/GlTfExport.java
+58
-35
No files found.
src/main/java/com/elphel/imagej/cameras/CLTParameters.java
View file @
5ae26946
...
@@ -424,6 +424,7 @@ public class CLTParameters {
...
@@ -424,6 +424,7 @@ public class CLTParameters {
public
int
min_bgnd_tiles
=
10
;
// Minimal number of background tiles to generate background
public
int
min_bgnd_tiles
=
10
;
// Minimal number of background tiles to generate background
public
boolean
gltf_emissive
=
false
;
// true; // Use emissive textures
public
boolean
gltf_emissive
=
false
;
// true; // Use emissive textures
public
boolean
gltf_alpha_blend
=
false
;
// true; // Use alpha blend (false - opaque)
public
boolean
show_textures
=
true
;
// show generated textures
public
boolean
show_textures
=
true
;
// show generated textures
public
boolean
debug_filters
=
false
;
// show intermediate results of filtering
public
boolean
debug_filters
=
false
;
// show intermediate results of filtering
...
@@ -1450,6 +1451,7 @@ public class CLTParameters {
...
@@ -1450,6 +1451,7 @@ public class CLTParameters {
properties
.
setProperty
(
prefix
+
"min_bgnd_tiles"
,
this
.
min_bgnd_tiles
+
""
);
properties
.
setProperty
(
prefix
+
"min_bgnd_tiles"
,
this
.
min_bgnd_tiles
+
""
);
properties
.
setProperty
(
prefix
+
"gltf_emissive"
,
this
.
gltf_emissive
+
""
);
properties
.
setProperty
(
prefix
+
"gltf_emissive"
,
this
.
gltf_emissive
+
""
);
properties
.
setProperty
(
prefix
+
"gltf_alpha_blend"
,
this
.
gltf_alpha_blend
+
""
);
properties
.
setProperty
(
prefix
+
"show_textures"
,
this
.
show_textures
+
""
);
properties
.
setProperty
(
prefix
+
"show_textures"
,
this
.
show_textures
+
""
);
properties
.
setProperty
(
prefix
+
"debug_filters"
,
this
.
debug_filters
+
""
);
properties
.
setProperty
(
prefix
+
"debug_filters"
,
this
.
debug_filters
+
""
);
...
@@ -2354,6 +2356,7 @@ public class CLTParameters {
...
@@ -2354,6 +2356,7 @@ public class CLTParameters {
if
(
properties
.
getProperty
(
prefix
+
"min_bgnd_tiles"
)!=
null
)
this
.
min_bgnd_tiles
=
Integer
.
parseInt
(
properties
.
getProperty
(
prefix
+
"min_bgnd_tiles"
));
if
(
properties
.
getProperty
(
prefix
+
"min_bgnd_tiles"
)!=
null
)
this
.
min_bgnd_tiles
=
Integer
.
parseInt
(
properties
.
getProperty
(
prefix
+
"min_bgnd_tiles"
));
if
(
properties
.
getProperty
(
prefix
+
"gltf_emissive"
)!=
null
)
this
.
gltf_emissive
=
Boolean
.
parseBoolean
(
properties
.
getProperty
(
prefix
+
"gltf_emissive"
));
if
(
properties
.
getProperty
(
prefix
+
"gltf_emissive"
)!=
null
)
this
.
gltf_emissive
=
Boolean
.
parseBoolean
(
properties
.
getProperty
(
prefix
+
"gltf_emissive"
));
if
(
properties
.
getProperty
(
prefix
+
"gltf_alpha_blend"
)!=
null
)
this
.
gltf_alpha_blend
=
Boolean
.
parseBoolean
(
properties
.
getProperty
(
prefix
+
"gltf_alpha_blend"
));
if
(
properties
.
getProperty
(
prefix
+
"show_textures"
)!=
null
)
this
.
show_textures
=
Boolean
.
parseBoolean
(
properties
.
getProperty
(
prefix
+
"show_textures"
));
if
(
properties
.
getProperty
(
prefix
+
"show_textures"
)!=
null
)
this
.
show_textures
=
Boolean
.
parseBoolean
(
properties
.
getProperty
(
prefix
+
"show_textures"
));
if
(
properties
.
getProperty
(
prefix
+
"debug_filters"
)!=
null
)
this
.
debug_filters
=
Boolean
.
parseBoolean
(
properties
.
getProperty
(
prefix
+
"debug_filters"
));
if
(
properties
.
getProperty
(
prefix
+
"debug_filters"
)!=
null
)
this
.
debug_filters
=
Boolean
.
parseBoolean
(
properties
.
getProperty
(
prefix
+
"debug_filters"
));
...
@@ -3450,6 +3453,7 @@ public class CLTParameters {
...
@@ -3450,6 +3453,7 @@ public class CLTParameters {
gd
.
addMessage
(
"glTF export"
);
gd
.
addMessage
(
"glTF export"
);
gd
.
addCheckbox
(
"glTF use emissive textures"
,
this
.
gltf_emissive
);
gd
.
addCheckbox
(
"glTF use emissive textures"
,
this
.
gltf_emissive
);
gd
.
addCheckbox
(
"glTF use alpha blend"
,
this
.
gltf_alpha_blend
);
gd
.
addMessage
(
"Earlier 3D generation parameters"
);
gd
.
addMessage
(
"Earlier 3D generation parameters"
);
gd
.
addCheckbox
(
"Show generated textures"
,
this
.
show_textures
);
gd
.
addCheckbox
(
"Show generated textures"
,
this
.
show_textures
);
...
@@ -4492,6 +4496,7 @@ public class CLTParameters {
...
@@ -4492,6 +4496,7 @@ public class CLTParameters {
this
.
min_bgnd_tiles
=
(
int
)
gd
.
getNextNumber
();
this
.
min_bgnd_tiles
=
(
int
)
gd
.
getNextNumber
();
this
.
gltf_emissive
=
gd
.
getNextBoolean
();
this
.
gltf_emissive
=
gd
.
getNextBoolean
();
this
.
gltf_alpha_blend
=
gd
.
getNextBoolean
();
this
.
show_textures
=
gd
.
getNextBoolean
();
this
.
show_textures
=
gd
.
getNextBoolean
();
this
.
debug_filters
=
gd
.
getNextBoolean
();
this
.
debug_filters
=
gd
.
getNextBoolean
();
...
...
src/main/java/com/elphel/imagej/tileprocessor/TexturedModel.java
View file @
5ae26946
...
@@ -1845,6 +1845,7 @@ public class TexturedModel {
...
@@ -1845,6 +1845,7 @@ public class TexturedModel {
{
{
final
boolean
batch_mode
=
clt_parameters
.
batch_run
;
final
boolean
batch_mode
=
clt_parameters
.
batch_run
;
final
boolean
gltf_emissive
=
clt_parameters
.
gltf_emissive
;
final
boolean
gltf_emissive
=
clt_parameters
.
gltf_emissive
;
final
boolean
use_alpha_blend
=
false
;
final
int
ref_index
=
scenes
.
length
-
1
;
final
int
ref_index
=
scenes
.
length
-
1
;
final
QuadCLT
ref_scene
=
scenes
[
ref_index
];
final
QuadCLT
ref_scene
=
scenes
[
ref_index
];
final
TileProcessor
tp
=
ref_scene
.
getTileProcessor
();
final
TileProcessor
tp
=
ref_scene
.
getTileProcessor
();
...
@@ -2300,10 +2301,11 @@ public class TexturedModel {
...
@@ -2300,10 +2301,11 @@ public class TexturedModel {
if
(
clt_parameters
.
output_glTF
&&
(
tri_meshes
!=
null
))
{
if
(
clt_parameters
.
output_glTF
&&
(
tri_meshes
!=
null
))
{
try
{
try
{
GlTfExport
.
glTFExport
(
GlTfExport
.
glTFExport
(
x3d_dir
,
// String x3d_dir,
x3d_dir
,
// String x3d_dir,
ref_scene
.
correctionsParameters
.
getModelName
(
ref_scene
.
getImageName
()),
// String model_name,
ref_scene
.
correctionsParameters
.
getModelName
(
ref_scene
.
getImageName
()),
// String model_name,
tri_meshes
,
// ArrayList<TriMesh> tri_meshes,
tri_meshes
,
// ArrayList<TriMesh> tri_meshes,
gltf_emissive
,
// boolean gltf_emissive,
gltf_emissive
,
// boolean gltf_emissive,
use_alpha_blend
,
// boolean use_alpha_blend,
1
);
1
);
}
catch
(
JSONException
e
)
{
}
catch
(
JSONException
e
)
{
// TODO Auto-generated catch block
// TODO Auto-generated catch block
...
...
src/main/java/com/elphel/imagej/x3d/export/GlTfExport.java
View file @
5ae26946
...
@@ -31,6 +31,7 @@ import java.nio.ByteBuffer;
...
@@ -31,6 +31,7 @@ import java.nio.ByteBuffer;
import
java.nio.ByteOrder
;
import
java.nio.ByteOrder
;
import
java.nio.channels.FileChannel
;
import
java.nio.channels.FileChannel
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
org.json.JSONArray
;
import
org.json.JSONArray
;
import
org.json.JSONException
;
import
org.json.JSONException
;
...
@@ -87,11 +88,12 @@ public class GlTfExport {
...
@@ -87,11 +88,12 @@ public class GlTfExport {
public
static
void
glTFExport
(
public
static
void
glTFExport
(
String
x3d_dir
,
String
x3d_dir
,
String
model_name
,
String
model_name
,
ArrayList
<
TriMesh
>
tri_meshes
,
ArrayList
<
TriMesh
>
tri_meshes
,
boolean
gltf_emissive
,
boolean
gltf_emissive
,
int
debugLevel
boolean
use_alpha_blend
,
int
debugLevel
)
throws
IOException
,
JSONException
{
)
throws
IOException
,
JSONException
{
boolean
invert_faces
=
true
;
// false; // true; // false; // true;
boolean
invert_faces
=
true
;
// false; // true; // false; // true;
boolean
[]
inv_xyz
=
{
false
,
false
,
false
};
boolean
[]
inv_xyz
=
{
false
,
false
,
false
};
...
@@ -172,7 +174,6 @@ public class GlTfExport {
...
@@ -172,7 +174,6 @@ public class GlTfExport {
}
else
if
(
triangles
[
i
][
j
]
>
minmax_indx
[
nmesh
][
1
])
{
}
else
if
(
triangles
[
i
][
j
]
>
minmax_indx
[
nmesh
][
1
])
{
minmax_indx
[
nmesh
][
1
]
=
triangles
[
i
][
j
];
minmax_indx
[
nmesh
][
1
]
=
triangles
[
i
][
j
];
}
}
}
}
}
}
}
}
...
@@ -241,7 +242,8 @@ public class GlTfExport {
...
@@ -241,7 +242,8 @@ public class GlTfExport {
String
[]
short_names
=
new
String
[
total_meshes
];
String
[]
short_names
=
new
String
[
total_meshes
];
for
(
int
nmesh
=
0
;
nmesh
<
total_meshes
;
nmesh
++)
{
for
(
int
nmesh
=
0
;
nmesh
<
total_meshes
;
nmesh
++)
{
String
tex_uri
=
tri_meshes
.
get
(
nmesh
).
getImage
();
String
tex_uri
=
tri_meshes
.
get
(
nmesh
).
getImage
();
short_names
[
nmesh
]
=
tex_uri
.
substring
(
tex_uri
.
indexOf
(
"-"
)+
1
,
tex_uri
.
lastIndexOf
(
"-"
));
// short_names[nmesh] = tex_uri.substring(tex_uri.indexOf("-")+1,tex_uri.lastIndexOf("-"));
short_names
[
nmesh
]
=
tex_uri
.
substring
(
tex_uri
.
indexOf
(
"-"
)+
1
,
tex_uri
.
lastIndexOf
(
"-"
))+
"-"
+
String
.
format
(
"%03d"
,
nmesh
);
}
}
JSONObject
gltf_json
=
new
JSONObject
();
JSONObject
gltf_json
=
new
JSONObject
();
...
@@ -269,28 +271,42 @@ public class GlTfExport {
...
@@ -269,28 +271,42 @@ public class GlTfExport {
gltf_scene0
.
put
(
"name"
,
model_name
);
gltf_scene0
.
put
(
"name"
,
model_name
);
gltf_scene0
.
put
(
"nodes"
,
gltf_scene0_nodes
);
gltf_scene0
.
put
(
"nodes"
,
gltf_scene0_nodes
);
// Crete scenes
// Cre
a
te scenes
JSONArray
gltf_scenes
=
new
JSONArray
();
JSONArray
gltf_scenes
=
new
JSONArray
();
gltf_scenes
.
put
(
gltf_scene0
);
gltf_scenes
.
put
(
gltf_scene0
);
gltf_json
.
put
(
"scenes"
,
gltf_scenes
);
gltf_json
.
put
(
"scenes"
,
gltf_scenes
);
// Create images
// Create images
JSONArray
gltf_images
=
new
JSONArray
();
HashMap
<
String
,
Integer
>
map_texture_url
=
new
HashMap
<
String
,
Integer
>();
int
[]
image_index
=
new
int
[
total_meshes
];
// nmesh first mentioning the url
boolean
[]
is_first_ref
=
new
boolean
[
total_meshes
];
// this nmesh is the first to mention
JSONArray
gltf_images
=
new
JSONArray
();
for
(
int
nmesh
=
0
;
nmesh
<
total_meshes
;
nmesh
++)
{
for
(
int
nmesh
=
0
;
nmesh
<
total_meshes
;
nmesh
++)
{
JSONObject
gltf_image
=
new
JSONObject
();
JSONObject
gltf_image
=
new
JSONObject
();
gltf_image
.
put
(
"uri"
,
tri_meshes
.
get
(
nmesh
).
getImage
());
String
uri
=
tri_meshes
.
get
(
nmesh
).
getImage
();
gltf_images
.
put
(
gltf_image
);
int
sz
=
map_texture_url
.
size
();
Integer
fm
=
map_texture_url
.
putIfAbsent
(
uri
,
sz
);
if
(
fm
==
null
)
{
// did not yet exist
gltf_image
.
put
(
"uri"
,
uri
);
gltf_images
.
put
(
gltf_image
);
image_index
[
nmesh
]
=
sz
;
is_first_ref
[
nmesh
]
=
true
;
}
else
{
image_index
[
nmesh
]
=
fm
;
}
}
}
gltf_json
.
put
(
"images"
,
gltf_images
);
gltf_json
.
put
(
"images"
,
gltf_images
);
// Create textures
// Create textures
JSONArray
gltf_textures
=
new
JSONArray
();
JSONArray
gltf_textures
=
new
JSONArray
();
for
(
int
nmesh
=
0
;
nmesh
<
total_meshes
;
nmesh
++)
{
for
(
int
nmesh
=
0
;
nmesh
<
total_meshes
;
nmesh
++)
{
JSONObject
gltf_texture
=
new
JSONObject
();
if
(
is_first_ref
[
nmesh
])
{
gltf_texture
.
put
(
"sampler"
,
0
);
JSONObject
gltf_texture
=
new
JSONObject
();
gltf_texture
.
put
(
"source"
,
nmesh
);
gltf_texture
.
put
(
"sampler"
,
0
);
gltf_texture
.
put
(
"name"
,
short_names
[
nmesh
]+
"-tex"
);
gltf_texture
.
put
(
"source"
,
image_index
[
nmesh
]);
// nmesh);
gltf_textures
.
put
(
gltf_texture
);
gltf_texture
.
put
(
"name"
,
short_names
[
nmesh
]+
"-tex"
);
gltf_textures
.
put
(
gltf_texture
);
}
}
}
gltf_json
.
put
(
"textures"
,
gltf_textures
);
gltf_json
.
put
(
"textures"
,
gltf_textures
);
...
@@ -321,26 +337,33 @@ or
...
@@ -321,26 +337,33 @@ or
// Create materials (material references texture, so each mesh object - new material
// Create materials (material references texture, so each mesh object - new material
JSONArray
gltf_materials
=
new
JSONArray
();
JSONArray
gltf_materials
=
new
JSONArray
();
for
(
int
nmesh
=
0
;
nmesh
<
total_meshes
;
nmesh
++)
{
for
(
int
nmesh
=
0
;
nmesh
<
total_meshes
;
nmesh
++)
{
JSONObject
gltf_material
=
new
JSONObject
();
if
(
is_first_ref
[
nmesh
])
{
JSONObject
gltf_pbrMetallicRoughness
=
new
JSONObject
();
int
indx
=
image_index
[
nmesh
];
JSONObject
gltf_baseColorTexture
=
new
JSONObject
();
JSONObject
gltf_material
=
new
JSONObject
();
gltf_baseColorTexture
.
put
(
"index"
,
nmesh
);
// reference corresponding texture
JSONObject
gltf_pbrMetallicRoughness
=
new
JSONObject
();
gltf_pbrMetallicRoughness
.
put
(
"baseColorTexture"
,
gltf_baseColorTexture
);
JSONObject
gltf_baseColorTexture
=
new
JSONObject
();
gltf_pbrMetallicRoughness
.
put
(
"metallicFactor"
,
0.0
);
gltf_baseColorTexture
.
put
(
"index"
,
indx
);
// nmesh); // reference corresponding texture
gltf_material
.
put
(
"pbrMetallicRoughness"
,
gltf_pbrMetallicRoughness
);
gltf_pbrMetallicRoughness
.
put
(
"baseColorTexture"
,
gltf_baseColorTexture
);
gltf_material
.
put
(
"name"
,
short_names
[
nmesh
]+
"-mat"
);
gltf_pbrMetallicRoughness
.
put
(
"metallicFactor"
,
0.0
);
gltf_material
.
put
(
"alphaMode"
,
ALPHAMODE_BLEND
);
gltf_material
.
put
(
"pbrMetallicRoughness"
,
gltf_pbrMetallicRoughness
);
if
(
gltf_emissive
)
{
gltf_material
.
put
(
"name"
,
short_names
[
nmesh
]+
"-mat"
);
JSONObject
gltf_emissiveTexture
=
new
JSONObject
();
if
(
use_alpha_blend
)
{
gltf_emissiveTexture
.
put
(
"index"
,
nmesh
);
gltf_material
.
put
(
"alphaMode"
,
ALPHAMODE_BLEND
);
gltf_material
.
put
(
"emissiveTexture"
,
gltf_emissiveTexture
);
}
else
{
JSONArray
gltf_material_emissiveFactor
=
new
JSONArray
();
gltf_material
.
put
(
"alphaMode"
,
ALPHAMODE_OPAQUE
);
gltf_material_emissiveFactor
.
put
(
1.0
);
}
gltf_material_emissiveFactor
.
put
(
1.0
);
if
(
gltf_emissive
)
{
gltf_material_emissiveFactor
.
put
(
1.0
);
JSONObject
gltf_emissiveTexture
=
new
JSONObject
();
gltf_material
.
put
(
"emissiveFactor"
,
gltf_material_emissiveFactor
);
gltf_emissiveTexture
.
put
(
"index"
,
indx
);
// nmesh);
gltf_material
.
put
(
"emissiveTexture"
,
gltf_emissiveTexture
);
JSONArray
gltf_material_emissiveFactor
=
new
JSONArray
();
gltf_material_emissiveFactor
.
put
(
1.0
);
gltf_material_emissiveFactor
.
put
(
1.0
);
gltf_material_emissiveFactor
.
put
(
1.0
);
gltf_material
.
put
(
"emissiveFactor"
,
gltf_material_emissiveFactor
);
}
gltf_materials
.
put
(
gltf_material
);
}
}
gltf_materials
.
put
(
gltf_material
);
}
}
gltf_json
.
put
(
"materials"
,
gltf_materials
);
gltf_json
.
put
(
"materials"
,
gltf_materials
);
...
@@ -461,7 +484,7 @@ or
...
@@ -461,7 +484,7 @@ or
gltf_mesh0_primitive
.
put
(
"attributes"
,
gltf_mesh0_primitive_attr
);
gltf_mesh0_primitive
.
put
(
"attributes"
,
gltf_mesh0_primitive_attr
);
gltf_mesh0_primitive
.
put
(
"indices"
,
3
*
nmesh
+
0
);
gltf_mesh0_primitive
.
put
(
"indices"
,
3
*
nmesh
+
0
);
gltf_mesh0_primitive
.
put
(
"mode"
,
MODE_TRIANGLES
);
gltf_mesh0_primitive
.
put
(
"mode"
,
MODE_TRIANGLES
);
gltf_mesh0_primitive
.
put
(
"material"
,
nmesh
);
gltf_mesh0_primitive
.
put
(
"material"
,
image_index
[
nmesh
]);
//
nmesh);
gltf_mesh0_primitives
.
put
(
gltf_mesh0_primitive
);
gltf_mesh0_primitives
.
put
(
gltf_mesh0_primitive
);
}
}
gltf_mesh0
.
put
(
"primitives"
,
gltf_mesh0_primitives
);
gltf_mesh0
.
put
(
"primitives"
,
gltf_mesh0_primitives
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment