mirror of
https://codeberg.org/icewind/vbsp-to-gltf.git
synced 2026-06-03 10:14:08 +02:00
gtlf 1.4
This commit is contained in:
parent
71fb7c395b
commit
cbccb8ae3d
6 changed files with 48 additions and 43 deletions
13
Cargo.lock
generated
13
Cargo.lock
generated
|
|
@ -540,15 +540,16 @@ checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gltf"
|
name = "gltf"
|
||||||
version = "1.3.0"
|
version = "1.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ad2dcfb6dd7a66f9eb3d181a29dcfb22d146b0bcdc2e1ed1713cbf03939a88ea"
|
checksum = "3b78f069cf941075835822953c345b9e1edd67ae347b81ace3aea9de38c2ef33"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64",
|
"base64",
|
||||||
"byteorder 1.5.0",
|
"byteorder 1.5.0",
|
||||||
"gltf-json",
|
"gltf-json",
|
||||||
"image 0.24.7",
|
"image 0.24.7",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
|
"serde_json",
|
||||||
"urlencoding",
|
"urlencoding",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -566,9 +567,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gltf-json"
|
name = "gltf-json"
|
||||||
version = "1.3.0"
|
version = "1.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7d5b810806b78dde4b71a95cc0e6fdcab34c4c617da3574df166f9987be97d03"
|
checksum = "655951ba557f2bc69ea4b0799446bae281fa78efae6319968bdd2c3e9a06d8e1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"gltf-derive",
|
"gltf-derive",
|
||||||
"serde",
|
"serde",
|
||||||
|
|
@ -1156,9 +1157,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.70"
|
version = "1.0.71"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b"
|
checksum = "75cb1540fadbd5b8fbccc4dddad2734eba435053f725621c070711a14bb5f4b8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,8 @@ image = "0.23.14"
|
||||||
tf-asset-loader = { version = "0.1", features = ["zip"] }
|
tf-asset-loader = { version = "0.1", features = ["zip"] }
|
||||||
vmdl = "0.1"
|
vmdl = "0.1"
|
||||||
clap = { version = "4.0.29", features = ["derive"] }
|
clap = { version = "4.0.29", features = ["derive"] }
|
||||||
gltf-json = "=1.3.0"
|
gltf-json = "1.4.0"
|
||||||
gltf = "=1.3.0"
|
gltf = "1.4.0"
|
||||||
cgmath = "0.18.0"
|
cgmath = "0.18.0"
|
||||||
bytemuck = { version = "1.14.0", features = ["derive"] }
|
bytemuck = { version = "1.14.0", features = ["derive"] }
|
||||||
|
|
||||||
|
|
|
||||||
25
src/bsp.rs
25
src/bsp.rs
|
|
@ -2,9 +2,10 @@ use crate::gltf_builder::push_or_get_material;
|
||||||
use crate::{map_coords, Error};
|
use crate::{map_coords, Error};
|
||||||
use bytemuck::{offset_of, Pod, Zeroable};
|
use bytemuck::{offset_of, Pod, Zeroable};
|
||||||
use gltf_json::accessor::{ComponentType, GenericComponentType, Type};
|
use gltf_json::accessor::{ComponentType, GenericComponentType, Type};
|
||||||
use gltf_json::buffer::{Target, View};
|
use gltf_json::buffer::{Stride, Target, View};
|
||||||
use gltf_json::mesh::{Mode, Primitive, Semantic};
|
use gltf_json::mesh::{Mode, Primitive, Semantic};
|
||||||
use gltf_json::validation::Checked::Valid;
|
use gltf_json::validation::Checked::Valid;
|
||||||
|
use gltf_json::validation::USize64;
|
||||||
use gltf_json::{Accessor, Index, Mesh, Node, Root, Value};
|
use gltf_json::{Accessor, Index, Mesh, Node, Root, Value};
|
||||||
use std::mem::size_of;
|
use std::mem::size_of;
|
||||||
use tf_asset_loader::Loader;
|
use tf_asset_loader::Loader;
|
||||||
|
|
@ -112,9 +113,9 @@ pub fn push_bsp_face(
|
||||||
loader: &Loader,
|
loader: &Loader,
|
||||||
face: &Handle<Face>,
|
face: &Handle<Face>,
|
||||||
) -> Primitive {
|
) -> Primitive {
|
||||||
let vertex_count = face.vertex_positions().count() as u32;
|
let vertex_count = face.vertex_positions().count() as u64;
|
||||||
|
|
||||||
let buffer_start = buffer.len() as u32;
|
let buffer_start = buffer.len() as u64;
|
||||||
|
|
||||||
let (min, max) = bounding_box(face.vertex_positions());
|
let (min, max) = bounding_box(face.vertex_positions());
|
||||||
|
|
||||||
|
|
@ -130,9 +131,9 @@ pub fn push_bsp_face(
|
||||||
|
|
||||||
let vertex_buffer_view = View {
|
let vertex_buffer_view = View {
|
||||||
buffer: Index::new(0),
|
buffer: Index::new(0),
|
||||||
byte_length: buffer.len() as u32 - buffer_start,
|
byte_length: USize64(buffer.len() as u64 - buffer_start),
|
||||||
byte_offset: Some(buffer_start),
|
byte_offset: Some(USize64(buffer_start)),
|
||||||
byte_stride: Some(size_of::<BspVertexData>() as u32),
|
byte_stride: Some(Stride(size_of::<BspVertexData>())),
|
||||||
extensions: Default::default(),
|
extensions: Default::default(),
|
||||||
extras: Default::default(),
|
extras: Default::default(),
|
||||||
name: None,
|
name: None,
|
||||||
|
|
@ -144,8 +145,8 @@ pub fn push_bsp_face(
|
||||||
|
|
||||||
let positions = Accessor {
|
let positions = Accessor {
|
||||||
buffer_view: Some(vertex_view),
|
buffer_view: Some(vertex_view),
|
||||||
byte_offset: Some(offset_of!(BspVertexData, position) as u32),
|
byte_offset: Some(USize64(offset_of!(BspVertexData, position) as u64)),
|
||||||
count: vertex_count,
|
count: USize64(vertex_count),
|
||||||
component_type: Valid(GenericComponentType(ComponentType::F32)),
|
component_type: Valid(GenericComponentType(ComponentType::F32)),
|
||||||
extensions: Default::default(),
|
extensions: Default::default(),
|
||||||
extras: Default::default(),
|
extras: Default::default(),
|
||||||
|
|
@ -158,8 +159,8 @@ pub fn push_bsp_face(
|
||||||
};
|
};
|
||||||
let normals = Accessor {
|
let normals = Accessor {
|
||||||
buffer_view: Some(vertex_view),
|
buffer_view: Some(vertex_view),
|
||||||
byte_offset: Some(offset_of!(BspVertexData, normal) as u32),
|
byte_offset: Some(USize64(offset_of!(BspVertexData, normal) as u64)),
|
||||||
count: vertex_count,
|
count: USize64(vertex_count),
|
||||||
component_type: Valid(GenericComponentType(ComponentType::F32)),
|
component_type: Valid(GenericComponentType(ComponentType::F32)),
|
||||||
extensions: Default::default(),
|
extensions: Default::default(),
|
||||||
extras: Default::default(),
|
extras: Default::default(),
|
||||||
|
|
@ -172,8 +173,8 @@ pub fn push_bsp_face(
|
||||||
};
|
};
|
||||||
let uvs = Accessor {
|
let uvs = Accessor {
|
||||||
buffer_view: Some(vertex_view),
|
buffer_view: Some(vertex_view),
|
||||||
byte_offset: Some(offset_of!(BspVertexData, uv) as u32),
|
byte_offset: Some(USize64(offset_of!(BspVertexData, uv) as u64)),
|
||||||
count: vertex_count,
|
count: USize64(vertex_count),
|
||||||
component_type: Valid(GenericComponentType(ComponentType::F32)),
|
component_type: Valid(GenericComponentType(ComponentType::F32)),
|
||||||
extensions: Default::default(),
|
extensions: Default::default(),
|
||||||
extras: Default::default(),
|
extras: Default::default(),
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ use gltf_json::image::MimeType;
|
||||||
use gltf_json::material::{AlphaCutoff, AlphaMode, PbrBaseColorFactor, PbrMetallicRoughness};
|
use gltf_json::material::{AlphaCutoff, AlphaMode, PbrBaseColorFactor, PbrMetallicRoughness};
|
||||||
use gltf_json::texture::Info;
|
use gltf_json::texture::Info;
|
||||||
use gltf_json::validation::Checked::Valid;
|
use gltf_json::validation::Checked::Valid;
|
||||||
|
use gltf_json::validation::USize64;
|
||||||
use gltf_json::{Extras, Image, Index, Material, Root, Texture};
|
use gltf_json::{Extras, Image, Index, Material, Root, Texture};
|
||||||
use image::png::PngEncoder;
|
use image::png::PngEncoder;
|
||||||
use image::{ColorType, DynamicImage, GenericImageView};
|
use image::{ColorType, DynamicImage, GenericImageView};
|
||||||
|
|
@ -105,7 +106,7 @@ fn push_texture(buffer: &mut Vec<u8>, gltf: &mut Root, texture: TextureData) ->
|
||||||
image = DynamicImage::ImageRgb8(image.into_rgb8());
|
image = DynamicImage::ImageRgb8(image.into_rgb8());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let buffer_start = buffer.len() as u32;
|
let buffer_start = buffer.len() as u64;
|
||||||
let view_start = gltf.buffer_views.len() as u32;
|
let view_start = gltf.buffer_views.len() as u32;
|
||||||
let image_start = gltf.images.len() as u32;
|
let image_start = gltf.images.len() as u32;
|
||||||
|
|
||||||
|
|
@ -122,13 +123,13 @@ fn push_texture(buffer: &mut Vec<u8>, gltf: &mut Root, texture: TextureData) ->
|
||||||
|
|
||||||
buffer.extend_from_slice(&png_buffer);
|
buffer.extend_from_slice(&png_buffer);
|
||||||
|
|
||||||
let byte_length = buffer.len() as u32 - buffer_start;
|
let byte_length = buffer.len() as u64 - buffer_start;
|
||||||
pad_byte_vector(buffer);
|
pad_byte_vector(buffer);
|
||||||
|
|
||||||
let view = View {
|
let view = View {
|
||||||
buffer: Index::new(0),
|
buffer: Index::new(0),
|
||||||
byte_length,
|
byte_length: USize64(byte_length),
|
||||||
byte_offset: Some(buffer_start),
|
byte_offset: Some(USize64(buffer_start)),
|
||||||
byte_stride: None,
|
byte_stride: None,
|
||||||
extensions: Default::default(),
|
extensions: Default::default(),
|
||||||
extras: Default::default(),
|
extras: Default::default(),
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ use cgmath::Matrix4;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
pub use error::Error;
|
pub use error::Error;
|
||||||
use gltf::Glb;
|
use gltf::Glb;
|
||||||
|
use gltf_json::validation::USize64;
|
||||||
use gltf_json::{Buffer, Index, Node, Root, Scene};
|
use gltf_json::{Buffer, Index, Node, Root, Scene};
|
||||||
use miette::Context;
|
use miette::Context;
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
|
@ -115,7 +116,7 @@ fn export(bsp: Bsp, loader: &Loader) -> Result<Glb<'static>, Error> {
|
||||||
}];
|
}];
|
||||||
|
|
||||||
root.buffers.push(Buffer {
|
root.buffers.push(Buffer {
|
||||||
byte_length: buffer.len() as u32,
|
byte_length: USize64(buffer.len() as u64),
|
||||||
extensions: Default::default(),
|
extensions: Default::default(),
|
||||||
extras: Default::default(),
|
extras: Default::default(),
|
||||||
name: None,
|
name: None,
|
||||||
|
|
|
||||||
37
src/prop.rs
37
src/prop.rs
|
|
@ -2,9 +2,10 @@ use crate::gltf_builder::push_or_get_material;
|
||||||
use crate::{map_coords, Error};
|
use crate::{map_coords, Error};
|
||||||
use bytemuck::{offset_of, Pod, Zeroable};
|
use bytemuck::{offset_of, Pod, Zeroable};
|
||||||
use gltf_json::accessor::{ComponentType, GenericComponentType, Type};
|
use gltf_json::accessor::{ComponentType, GenericComponentType, Type};
|
||||||
use gltf_json::buffer::{Target, View};
|
use gltf_json::buffer::{Stride, Target, View};
|
||||||
use gltf_json::mesh::{Mode, Primitive, Semantic};
|
use gltf_json::mesh::{Mode, Primitive, Semantic};
|
||||||
use gltf_json::validation::Checked::Valid;
|
use gltf_json::validation::Checked::Valid;
|
||||||
|
use gltf_json::validation::USize64;
|
||||||
use gltf_json::{Accessor, Index, Mesh, Root, Value};
|
use gltf_json::{Accessor, Index, Mesh, Root, Value};
|
||||||
use std::mem::size_of;
|
use std::mem::size_of;
|
||||||
use tf_asset_loader::Loader;
|
use tf_asset_loader::Loader;
|
||||||
|
|
@ -29,9 +30,9 @@ impl From<&vmdl::vvd::Vertex> for ModelVertex {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn push_vertices(buffer: &mut Vec<u8>, gltf: &mut Root, model: &Model) {
|
fn push_vertices(buffer: &mut Vec<u8>, gltf: &mut Root, model: &Model) {
|
||||||
let start = buffer.len() as u32;
|
let start = buffer.len() as u64;
|
||||||
let view_start = gltf.buffer_views.len() as u32;
|
let view_start = gltf.buffer_views.len() as u32;
|
||||||
let vertex_count = model.vertices().len() as u32;
|
let vertex_count = model.vertices().len() as u64;
|
||||||
|
|
||||||
let (min, max) = model.bounding_box();
|
let (min, max) = model.bounding_box();
|
||||||
let min = map_coords(min);
|
let min = map_coords(min);
|
||||||
|
|
@ -46,9 +47,9 @@ fn push_vertices(buffer: &mut Vec<u8>, gltf: &mut Root, model: &Model) {
|
||||||
|
|
||||||
let vertex_buffer_view = View {
|
let vertex_buffer_view = View {
|
||||||
buffer: Index::new(0),
|
buffer: Index::new(0),
|
||||||
byte_length: buffer.len() as u32 - start,
|
byte_length: USize64(buffer.len() as u64 - start),
|
||||||
byte_offset: Some(start),
|
byte_offset: Some(USize64(start)),
|
||||||
byte_stride: Some(size_of::<ModelVertex>() as u32),
|
byte_stride: Some(Stride(size_of::<ModelVertex>())),
|
||||||
extensions: Default::default(),
|
extensions: Default::default(),
|
||||||
extras: Default::default(),
|
extras: Default::default(),
|
||||||
name: None,
|
name: None,
|
||||||
|
|
@ -59,8 +60,8 @@ fn push_vertices(buffer: &mut Vec<u8>, gltf: &mut Root, model: &Model) {
|
||||||
|
|
||||||
let positions = Accessor {
|
let positions = Accessor {
|
||||||
buffer_view: Some(Index::new(view_start)),
|
buffer_view: Some(Index::new(view_start)),
|
||||||
byte_offset: Some(offset_of!(ModelVertex, position) as u32),
|
byte_offset: Some(USize64(offset_of!(ModelVertex, position) as u64)),
|
||||||
count: vertex_count,
|
count: USize64(vertex_count),
|
||||||
component_type: Valid(GenericComponentType(ComponentType::F32)),
|
component_type: Valid(GenericComponentType(ComponentType::F32)),
|
||||||
extensions: Default::default(),
|
extensions: Default::default(),
|
||||||
extras: Default::default(),
|
extras: Default::default(),
|
||||||
|
|
@ -73,8 +74,8 @@ fn push_vertices(buffer: &mut Vec<u8>, gltf: &mut Root, model: &Model) {
|
||||||
};
|
};
|
||||||
let uvs = Accessor {
|
let uvs = Accessor {
|
||||||
buffer_view: Some(Index::new(view_start)),
|
buffer_view: Some(Index::new(view_start)),
|
||||||
byte_offset: Some(offset_of!(ModelVertex, uv) as u32),
|
byte_offset: Some(USize64(offset_of!(ModelVertex, uv) as u64)),
|
||||||
count: vertex_count,
|
count: USize64(vertex_count),
|
||||||
component_type: Valid(GenericComponentType(ComponentType::F32)),
|
component_type: Valid(GenericComponentType(ComponentType::F32)),
|
||||||
extensions: Default::default(),
|
extensions: Default::default(),
|
||||||
extras: Default::default(),
|
extras: Default::default(),
|
||||||
|
|
@ -87,8 +88,8 @@ fn push_vertices(buffer: &mut Vec<u8>, gltf: &mut Root, model: &Model) {
|
||||||
};
|
};
|
||||||
let normals = Accessor {
|
let normals = Accessor {
|
||||||
buffer_view: Some(Index::new(view_start)),
|
buffer_view: Some(Index::new(view_start)),
|
||||||
byte_offset: Some(offset_of!(ModelVertex, normal) as u32),
|
byte_offset: Some(USize64(offset_of!(ModelVertex, normal) as u64)),
|
||||||
count: vertex_count,
|
count: USize64(vertex_count),
|
||||||
component_type: Valid(GenericComponentType(ComponentType::F32)),
|
component_type: Valid(GenericComponentType(ComponentType::F32)),
|
||||||
extensions: Default::default(),
|
extensions: Default::default(),
|
||||||
extras: Default::default(),
|
extras: Default::default(),
|
||||||
|
|
@ -182,7 +183,7 @@ pub fn push_primitive(
|
||||||
vertex_accessor_start: u32,
|
vertex_accessor_start: u32,
|
||||||
skin: &SkinTable,
|
skin: &SkinTable,
|
||||||
) -> Primitive {
|
) -> Primitive {
|
||||||
let buffer_start = buffer.len() as u32;
|
let buffer_start = buffer.len() as u64;
|
||||||
let view_start = gltf.buffer_views.len() as u32;
|
let view_start = gltf.buffer_views.len() as u32;
|
||||||
let accessor_start = gltf.accessors.len() as u32;
|
let accessor_start = gltf.accessors.len() as u32;
|
||||||
|
|
||||||
|
|
@ -192,12 +193,12 @@ pub fn push_primitive(
|
||||||
.flat_map(|index| (index as u32).to_le_bytes()),
|
.flat_map(|index| (index as u32).to_le_bytes()),
|
||||||
);
|
);
|
||||||
|
|
||||||
let byte_length = buffer.len() as u32 - buffer_start;
|
let byte_length = buffer.len() as u64 - buffer_start;
|
||||||
|
|
||||||
let view = View {
|
let view = View {
|
||||||
buffer: Index::new(0),
|
buffer: Index::new(0),
|
||||||
byte_length,
|
byte_length: USize64(byte_length),
|
||||||
byte_offset: Some(buffer_start),
|
byte_offset: Some(USize64(buffer_start)),
|
||||||
byte_stride: None,
|
byte_stride: None,
|
||||||
extensions: Default::default(),
|
extensions: Default::default(),
|
||||||
extras: Default::default(),
|
extras: Default::default(),
|
||||||
|
|
@ -208,8 +209,8 @@ pub fn push_primitive(
|
||||||
|
|
||||||
let accessor = Accessor {
|
let accessor = Accessor {
|
||||||
buffer_view: Some(Index::new(view_start)),
|
buffer_view: Some(Index::new(view_start)),
|
||||||
byte_offset: Some(0),
|
byte_offset: Some(USize64(0)),
|
||||||
count: byte_length / size_of::<u32>() as u32,
|
count: USize64(byte_length / size_of::<u32>() as u64),
|
||||||
component_type: Valid(GenericComponentType(ComponentType::U32)),
|
component_type: Valid(GenericComponentType(ComponentType::U32)),
|
||||||
extensions: Default::default(),
|
extensions: Default::default(),
|
||||||
extras: Default::default(),
|
extras: Default::default(),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue