Skip to content

Commit

Permalink
feat: add support for skinned Mesh
Browse files Browse the repository at this point in the history
Squashed commit of the following:

commit 5fd46e2
Author: Michael Pollind <[email protected]>
Date:   Mon Nov 29 17:54:39 2021 -0800

    chore: update to skinned mesh

commit 06f2189
Author: Michael Pollind <[email protected]>
Date:   Mon Nov 29 12:11:06 2021 -0800

    feat: add skinned mesh Material

commit 63d817a
Author: Michael Pollind <[email protected]>
Date:   Sun Nov 28 23:11:04 2021 -0800

    feat: replace skeletalMesh with skinnedMesh

commit 67bd3bf
Author: Michael Pollind <[email protected]>
Date:   Sun Nov 28 21:02:39 2021 -0800

    feat: implement skinned mesh
  • Loading branch information
pollend committed Apr 10, 2022
1 parent b41012d commit 50f619e
Show file tree
Hide file tree
Showing 19 changed files with 1,305 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.terasology.engine.core.subsystem.headless.assets.HeadlessMesh;
import org.terasology.engine.core.subsystem.headless.assets.HeadlessShader;
import org.terasology.engine.core.subsystem.headless.assets.HeadlessSkeletalMesh;
import org.terasology.engine.core.subsystem.headless.assets.HeadlessSkinnedMesh;
import org.terasology.engine.core.subsystem.headless.assets.HeadlessTexture;
import org.terasology.engine.entitySystem.entity.internal.EngineEntityManager;
import org.terasology.engine.entitySystem.prefab.Prefab;
Expand All @@ -48,6 +49,7 @@
import org.terasology.engine.rendering.assets.font.FontImpl;
import org.terasology.engine.rendering.assets.material.Material;
import org.terasology.engine.rendering.assets.mesh.Mesh;
import org.terasology.engine.rendering.assets.mesh.SkinnedMesh;
import org.terasology.engine.rendering.assets.shader.Shader;
import org.terasology.engine.rendering.assets.skeletalmesh.SkeletalMesh;
import org.terasology.engine.rendering.assets.texture.PNGTextureFormat;
Expand Down Expand Up @@ -230,6 +232,8 @@ protected AssetManager setupAssetManager() {
HeadlessMesh::new, "mesh");
assetTypeManager.createAssetType(SkeletalMesh.class,
HeadlessSkeletalMesh::new, "skeletalMesh");
assetTypeManager.createAssetType(SkinnedMesh.class,
HeadlessSkinnedMesh::new, "skeletalMesh");
assetTypeManager.createAssetType(MeshAnimation.class,
MeshAnimationImpl::new, "animations");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.terasology.engine.core.subsystem.headless.assets.HeadlessMesh;
import org.terasology.engine.core.subsystem.headless.assets.HeadlessShader;
import org.terasology.engine.core.subsystem.headless.assets.HeadlessSkeletalMesh;
import org.terasology.engine.core.subsystem.headless.assets.HeadlessSkinnedMesh;
import org.terasology.engine.core.subsystem.headless.assets.HeadlessTexture;
import org.terasology.engine.core.subsystem.headless.device.HeadlessDisplayDevice;
import org.terasology.engine.core.subsystem.headless.renderer.HeadlessCanvasRenderer;
Expand All @@ -23,6 +24,7 @@
import org.terasology.engine.rendering.assets.font.FontImpl;
import org.terasology.engine.rendering.assets.material.Material;
import org.terasology.engine.rendering.assets.mesh.Mesh;
import org.terasology.engine.rendering.assets.mesh.SkinnedMesh;
import org.terasology.engine.rendering.assets.shader.Shader;
import org.terasology.engine.rendering.assets.skeletalmesh.SkeletalMesh;
import org.terasology.engine.rendering.assets.texture.PNGTextureFormat;
Expand Down Expand Up @@ -55,6 +57,7 @@ public void registerCoreAssetTypes(ModuleAwareAssetTypeManager assetTypeManager)
assetTypeManager.createAssetType(Material.class, HeadlessMaterial::new, "materials");
assetTypeManager.createAssetType(Mesh.class, HeadlessMesh::new, "mesh");
assetTypeManager.createAssetType(SkeletalMesh.class, HeadlessSkeletalMesh::new, "skeletalMesh");
assetTypeManager.createAssetType(SkinnedMesh.class, HeadlessSkinnedMesh::new, "skeletalMesh");
assetTypeManager.createAssetType(MeshAnimation.class, MeshAnimationImpl::new, "animations");
assetTypeManager.createAssetType(Atlas.class, Atlas::new, "atlas");
assetTypeManager.createAssetType(Subtexture.class, Subtexture::new);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
// Copyright 2021 The Terasology Foundation
// SPDX-License-Identifier: Apache-2.0
package org.terasology.engine.core.subsystem.headless.assets;

import com.google.common.collect.Maps;
import org.joml.Vector3f;
import org.joml.Vector3fc;
import org.terasology.engine.rendering.assets.mesh.SkinnedMesh;
import org.terasology.engine.rendering.assets.mesh.SkinnedMeshData;
import org.terasology.engine.rendering.assets.mesh.resource.VertexAttributeBinding;
import org.terasology.engine.rendering.assets.mesh.resource.VertexByteAttributeBinding;
import org.terasology.engine.rendering.assets.skeletalmesh.Bone;
import org.terasology.gestalt.assets.AssetType;
import org.terasology.gestalt.assets.ResourceUrn;
import org.terasology.joml.geom.AABBf;
import org.terasology.joml.geom.AABBfc;

import java.util.List;
import java.util.Map;

public class HeadlessSkinnedMesh extends SkinnedMesh {

private List<Bone> bones;
private Map<String, Bone> boneLookup = Maps.newHashMap();
private VertexAttributeBinding<Vector3fc, Vector3f> positions;
private VertexByteAttributeBinding boneIndex0;
private VertexByteAttributeBinding boneIndex1;
private VertexByteAttributeBinding boneIndex2;
private VertexByteAttributeBinding boneIndex3;
private AABBf bounds;

public HeadlessSkinnedMesh(ResourceUrn urn, AssetType<?, SkinnedMeshData> assetType, SkinnedMeshData skinnedMesh) {
super(urn, assetType);
reload(skinnedMesh);
}

@Override
protected void doReload(SkinnedMeshData data) {
this.boneLookup.clear();
this.positions = data.positions();
this.boneIndex0 = data.boneIndex0();
this.boneIndex1 = data.boneIndex0();
this.boneIndex2 = data.boneIndex0();
this.boneIndex3 = data.boneIndex0();
this.bones.forEach(b -> {
boneLookup.put(b.getName(), b);
});
getBound(bounds);
}

@Override
public AABBfc getAABB() {
return bounds;
}

@Override
public VertexAttributeBinding<Vector3fc, Vector3f> vertices() {
return positions;
}

@Override
public int elementCount() {
return this.positions.elements();
}

@Override
public VertexByteAttributeBinding boneIndex0() {
return boneIndex0;
}

@Override
public VertexByteAttributeBinding boneIndex1() {
return boneIndex1;
}

@Override
public VertexByteAttributeBinding boneIndex2() {
return boneIndex2;
}

@Override
public VertexByteAttributeBinding boneIndex3() {
return boneIndex3;
}

@Override
public List<Bone> bones() {
return bones;
}

@Override
public Bone getBone(String boneName) {
return boneLookup.get(boneName);
}

@Override
public void render() {

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.terasology.engine.rendering.assets.font.FontImpl;
import org.terasology.engine.rendering.assets.material.Material;
import org.terasology.engine.rendering.assets.mesh.Mesh;
import org.terasology.engine.rendering.assets.mesh.SkinnedMesh;
import org.terasology.engine.rendering.assets.shader.Shader;
import org.terasology.engine.rendering.assets.skeletalmesh.SkeletalMesh;
import org.terasology.engine.rendering.assets.texture.PNGTextureFormat;
Expand All @@ -28,6 +29,7 @@
import org.terasology.engine.rendering.opengl.GLSLShader;
import org.terasology.engine.rendering.opengl.OpenGLMesh;
import org.terasology.engine.rendering.opengl.OpenGLSkeletalMesh;
import org.terasology.engine.rendering.opengl.OpenGLSkinnedMesh;
import org.terasology.engine.rendering.opengl.OpenGLTexture;
import org.terasology.gestalt.assets.AssetType;
import org.terasology.gestalt.assets.module.ModuleAssetScanner;
Expand Down Expand Up @@ -90,6 +92,10 @@ public void registerCoreAssetTypes(ModuleAwareAssetTypeManager assetTypeManager)
(urn, assetType, data) ->
OpenGLSkeletalMesh.create(urn, assetType, data, this),
"skeletalMesh");
assetTypeManager.createAssetType(SkinnedMesh.class,
(urn, assetType, data) ->
OpenGLSkinnedMesh.create(urn, assetType, data, this),
"skeletalMesh");
assetTypeManager.createAssetType(MeshAnimation.class, MeshAnimationImpl::new,
"animations", "skeletalMesh");
assetTypeManager.createAssetType(Atlas.class, Atlas::new, "atlas");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@

package org.terasology.engine.rendering.assets.animation;

import org.terasology.engine.rendering.assets.mesh.SkinnedMesh;
import org.terasology.gestalt.assets.Asset;
import org.terasology.gestalt.assets.AssetType;
import org.terasology.gestalt.assets.ResourceUrn;
import org.terasology.engine.rendering.assets.skeletalmesh.SkeletalMesh;
import org.terasology.joml.geom.AABBf;

public abstract class MeshAnimation extends Asset<MeshAnimationData> {
Expand All @@ -15,7 +15,7 @@ protected MeshAnimation(ResourceUrn urn, AssetType<?, MeshAnimationData> assetTy
super(urn, assetType);
}

public abstract boolean isValidAnimationFor(SkeletalMesh mesh);
public abstract boolean isValidAnimationFor(SkinnedMesh mesh);

public abstract int getBoneCount();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
// SPDX-License-Identifier: Apache-2.0
package org.terasology.engine.rendering.assets.animation;

import org.terasology.engine.rendering.assets.mesh.SkinnedMesh;
import org.terasology.gestalt.assets.Asset;
import org.terasology.gestalt.assets.AssetType;
import org.terasology.gestalt.assets.ResourceUrn;
import org.terasology.engine.rendering.assets.skeletalmesh.Bone;
import org.terasology.engine.rendering.assets.skeletalmesh.SkeletalMesh;
import org.terasology.joml.geom.AABBf;

import java.util.Optional;
Expand All @@ -21,7 +21,7 @@ public MeshAnimationImpl(ResourceUrn urn, AssetType<?, MeshAnimationData> assetT
}

@Override
public boolean isValidAnimationFor(SkeletalMesh mesh) {
public boolean isValidAnimationFor(SkinnedMesh mesh) {
for (int i = 0; i < data.getBoneNames().size(); ++i) {
Bone bone = mesh.getBone(data.getBoneNames().get(i));
boolean hasParent = data.getBoneParent().get(i) != MeshAnimationData.NO_PARENT;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
// Copyright 2021 The Terasology Foundation
// SPDX-License-Identifier: Apache-2.0

package org.terasology.engine.rendering.assets.mesh;

import org.joml.Vector3f;
import org.joml.Vector3fc;
import org.terasology.engine.rendering.assets.mesh.resource.VertexAttributeBinding;
import org.terasology.engine.rendering.assets.mesh.resource.VertexByteAttributeBinding;
import org.terasology.engine.rendering.assets.skeletalmesh.Bone;
import org.terasology.gestalt.assets.Asset;
import org.terasology.gestalt.assets.AssetType;
import org.terasology.gestalt.assets.DisposableResource;
import org.terasology.gestalt.assets.ResourceUrn;
import org.terasology.joml.geom.AABBf;
import org.terasology.joml.geom.AABBfc;

import java.util.List;

public abstract class SkinnedMesh extends Asset<SkinnedMeshData> {

protected SkinnedMesh(ResourceUrn urn, AssetType<?, SkinnedMeshData> assetType) {
super(urn, assetType);
}

protected SkinnedMesh(ResourceUrn urn, AssetType<?, SkinnedMeshData> assetType, DisposableResource resource) {
super(urn, assetType, resource);
}

public abstract AABBfc getAABB();

protected AABBf getBound(AABBf dest) {
VertexAttributeBinding<Vector3fc, Vector3f> vertices = this.vertices();
if (elementCount() == 0) {
dest.set(Float.POSITIVE_INFINITY,
Float.POSITIVE_INFINITY,
Float.POSITIVE_INFINITY,
Float.NEGATIVE_INFINITY,
Float.NEGATIVE_INFINITY,
Float.NEGATIVE_INFINITY);
return dest;
}
Vector3f pos = new Vector3f();
for (int x = 0; x < elementCount(); x++) {
dest.union(vertices.get(x, pos));
}
return dest;
}

public abstract VertexAttributeBinding<Vector3fc, Vector3f> vertices();
public abstract int elementCount();

public abstract VertexByteAttributeBinding boneIndex0();
public abstract VertexByteAttributeBinding boneIndex1();
public abstract VertexByteAttributeBinding boneIndex2();
public abstract VertexByteAttributeBinding boneIndex3();
public abstract List<Bone> bones();
public abstract Bone getBone(String name);
public abstract void render();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// Copyright 2021 The Terasology Foundation
// SPDX-License-Identifier: Apache-2.0

package org.terasology.engine.rendering.assets.mesh;

import org.joml.Vector4f;
import org.joml.Vector4fc;
import org.terasology.engine.rendering.assets.mesh.resource.AllocationType;
import org.terasology.engine.rendering.assets.mesh.resource.DrawingMode;
import org.terasology.engine.rendering.assets.mesh.resource.VertexAttributeBinding;
import org.terasology.engine.rendering.assets.mesh.resource.VertexByteAttributeBinding;
import org.terasology.engine.rendering.assets.skeletalmesh.Bone;

import java.util.List;

public abstract class SkinnedMeshData extends MeshData {

public SkinnedMeshData() {
this(DrawingMode.TRIANGLES, AllocationType.STATIC);
}

public SkinnedMeshData(DrawingMode mode, AllocationType allocationType) {
super(mode, allocationType);
}

public abstract VertexByteAttributeBinding boneIndex0();
public abstract VertexByteAttributeBinding boneIndex1();
public abstract VertexByteAttributeBinding boneIndex2();
public abstract VertexByteAttributeBinding boneIndex3();
public abstract VertexAttributeBinding<Vector4fc, Vector4f> weight();
public abstract List<Bone> bones();

}
Loading

0 comments on commit 50f619e

Please sign in to comment.