Skip to content

Commit

Permalink
fix: 3D models in .obj format without normals are now loaded correctl…
Browse files Browse the repository at this point in the history
…y, related to #1245
  • Loading branch information
AlmasB committed Mar 18, 2023
1 parent 590f25b commit 4fa21a8
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 8 deletions.
3 changes: 3 additions & 0 deletions fxgl/src/main/kotlin/com/almasb/fxgl/scene3d/obj/ObjData.kt
Expand Up @@ -9,6 +9,7 @@ package com.almasb.fxgl.scene3d.obj
import javafx.scene.paint.Color
import javafx.scene.paint.Material
import javafx.scene.paint.PhongMaterial
import javafx.scene.shape.VertexFormat
import java.net.URL

/**
Expand Down Expand Up @@ -52,6 +53,8 @@ internal class SubGroup {
var ambientColor: Color? = null

var smoothingGroup = -1

var vertexFormat = VertexFormat.POINT_TEXCOORD
}

internal class MtlData(
Expand Down
20 changes: 12 additions & 8 deletions fxgl/src/main/kotlin/com/almasb/fxgl/scene3d/obj/ObjModelLoader.kt
Expand Up @@ -99,14 +99,14 @@ class ObjModelLoader : Model3DLoader {
// f v1
1 -> {
data.currentGroup.currentSubGroup.faces += faceVertex[0].toInt() - 1
data.currentGroup.currentSubGroup.faces += 0
// add vt1 as 0
data.currentGroup.currentSubGroup.faces += 0
}

// f v1/vt1
2 -> {
data.currentGroup.currentSubGroup.faces += faceVertex[0].toInt() - 1
data.currentGroup.currentSubGroup.faces += 0
// add vt1
data.currentGroup.currentSubGroup.faces += faceVertex[1].toInt() - 1
}

Expand All @@ -115,7 +115,9 @@ class ObjModelLoader : Model3DLoader {
3 -> {
data.currentGroup.currentSubGroup.faces += faceVertex[0].toInt() - 1
data.currentGroup.currentSubGroup.faces += faceVertex[2].toInt() - 1
// add vt1 if present, else 0
data.currentGroup.currentSubGroup.faces += (faceVertex[1].toIntOrNull() ?: 1) - 1
data.currentGroup.currentSubGroup.vertexFormat = VertexFormat.POINT_NORMAL_TEXCOORD
}
}
}
Expand Down Expand Up @@ -237,7 +239,7 @@ class ObjModelLoader : Model3DLoader {
// TODO: ?
if (!it.faces.isEmpty()) {

val mesh = TriangleMesh(VertexFormat.POINT_NORMAL_TEXCOORD)
val mesh = TriangleMesh(it.vertexFormat)

mesh.points.addAll(*data.vertices.map { it * 0.05f }.toFloatArray())

Expand All @@ -248,11 +250,13 @@ class ObjModelLoader : Model3DLoader {
mesh.texCoords.addAll(*data.vertexTextures.toFloatArray())
}

// if there are no vertex normals, just add 3 values
if (data.vertexNormals.isEmpty()) {
mesh.normals.addAll(*FloatArray(3) { _ -> 0.0f })
} else {
mesh.normals.addAll(*data.vertexNormals.toFloatArray())
if (it.vertexFormat === VertexFormat.POINT_NORMAL_TEXCOORD) {
// if there are no vertex normals, just add 3 values
if (data.vertexNormals.isEmpty()) {
mesh.normals.addAll(*FloatArray(3) { _ -> 0.0f })
} else {
mesh.normals.addAll(*data.vertexNormals.toFloatArray())
}
}

mesh.faces.addAll(*it.faces.toIntArray())
Expand Down

0 comments on commit 4fa21a8

Please sign in to comment.