all objects

This commit is contained in:
tresabhi committed 2026-06-09 14:00:24 -05:00
1 parent 14a2658a83
commit 965acadc3f
3 files changed
+48 -12

No files matched your search

+17 -3
View File
@@ -224,10 +224,24 @@ public partial class GameInterface
var visualData = row.Get<UObject>("VisualData"); var visualData = row.Get<UObject>("VisualData");
var meshSettings = visualData.Get<FStructFallback>("MeshSettings"); var meshSettings = visualData.Get<FStructFallback>("MeshSettings");
// var collisionMesh = meshSettings.Get<UStaticMesh>("CollisionMesh"); var meshes = new List<UStaticMesh>();
var mesh = meshSettings.Get<UStaticMesh>("Mesh");
var gltf = new MonoGltf(mesh); foreach (var property in meshSettings.Properties)
{
var name = property.Name.Text;
if (name == "CollisionMesh")
{
continue;
}
if (meshSettings.TryGet<UStaticMesh>(name, out var mesh))
{
meshes.Add(mesh);
}
}
var gltf = new MonoGltf(meshes);
return gltf.Write($"{tag}/{part}"); return gltf.Write($"{tag}/{part}");
} }
+6 -3
View File
@@ -41,13 +41,15 @@ public class MonoGltf
}; };
readonly byte[] stubBytes = File.ReadAllBytes("../game/stub/small.png"); readonly byte[] stubBytes = File.ReadAllBytes("../game/stub/small.png");
public MonoGltf(UStaticMesh staticMesh) public MonoGltf(List<UStaticMesh> meshes)
{ {
var options = new ExporterOptions() { TextureFormat = ETextureFormat.Jpeg }; var options = new ExporterOptions() { TextureFormat = ETextureFormat.Jpeg };
staticMesh.TryConvert(out var convertedMesh); foreach (var mesh in meshes)
{
mesh.TryConvert(out var converted);
var lod0 = var lod0 =
convertedMesh.LODs.Find(lod => !lod.SkipLod) ?? throw new Exception("Failed to find lod0"); converted.LODs.Find(lod => !lod.SkipLod) ?? throw new Exception("Failed to find lod0");
var emptyMaterial = new MaterialBuilder("empty_material"); var emptyMaterial = new MaterialBuilder("empty_material");
var materialMap = new Dictionary<string, MaterialBuilder>(); var materialMap = new Dictionary<string, MaterialBuilder>();
@@ -125,6 +127,7 @@ public class MonoGltf
scene.AddRigidMesh(meshBuilder, Matrix4x4.Identity); scene.AddRigidMesh(meshBuilder, Matrix4x4.Identity);
} }
} }
}
public byte[] Write(string name) public byte[] Write(string name)
{ {
@@ -2,6 +2,7 @@ import { OrbitControls } from "@react-three/drei";
import { Canvas, useLoader } from "@react-three/fiber"; import { Canvas, useLoader } from "@react-three/fiber";
import { Mesh, MeshStandardMaterial } from "three"; import { Mesh, MeshStandardMaterial } from "three";
import { GLTFLoader } from "three-stdlib"; import { GLTFLoader } from "three-stdlib";
import { useProtagonist } from "../../hooks/useProtagonist";
import styles from "./index.module.css"; import styles from "./index.module.css";
export function TankopediaSandbox() { export function TankopediaSandbox() {
@@ -22,11 +23,19 @@ export function TankopediaSandbox() {
} }
function Content() { function Content() {
const gltf = useLoader( const tank = useProtagonist();
GLTFLoader,
"/models/tanks/TankEntity.A128_Concept_1b/hull.glb",
);
const turret = useLoader(
GLTFLoader,
`/models/tanks/${tank.id}/turret_01.glb`,
);
const gun = useLoader(GLTFLoader, `/models/tanks/${tank.id}/gun_01.glb`);
const hull = useLoader(GLTFLoader, `/models/tanks/${tank.id}/hull.glb`);
const chassis = useLoader(GLTFLoader, `/models/tanks/${tank.id}/chassis.glb`);
const gltfs = [turret, gun, hull, chassis];
for (const gltf of gltfs) {
gltf.scene.traverse((child) => { gltf.scene.traverse((child) => {
if ( if (
child instanceof Mesh && child instanceof Mesh &&
@@ -39,11 +48,21 @@ function Content() {
child.castShadow = true; child.castShadow = true;
child.receiveShadow = true; child.receiveShadow = true;
}); });
}
return ( return (
<> <>
<group> <group>
<primitive object={gltf.scene} /> <primitive object={chassis.scene} />
<primitive object={hull.scene} />
</group>
<group position={[0, 0, 5]}>
<primitive object={turret.scene} />
</group>
<group position={[0, 0, -5]}>
<primitive object={gun.scene} />
</group> </group>
<spotLight <spotLight
@@ -54,7 +73,7 @@ function Content() {
/> />
<ambientLight /> <ambientLight />
<mesh receiveShadow position={[0, -1, 0]} rotation={[-Math.PI / 2, 0, 0]}> <mesh receiveShadow rotation={[-Math.PI / 2, 0, 0]}>
<planeGeometry args={[2 ** 8, 2 ** 8]} /> <planeGeometry args={[2 ** 8, 2 ** 8]} />
<meshStandardMaterial color="gray" /> <meshStandardMaterial color="gray" />
</mesh> </mesh>