Implement MeshFoundry pipeline (#77)
Some checks failed
Native code generation / deterministic (push) Failing after 1m58s
Imaging and meshing gate / native (push) Failing after 4m10s
JPEG 2000 feature / linux (push) Successful in 3m0s
Native Rust workspace compile / compile (push) Failing after 6m12s
Skia feature / linux (push) Has been cancelled
Some checks failed
Native code generation / deterministic (push) Failing after 1m58s
Imaging and meshing gate / native (push) Failing after 4m10s
JPEG 2000 feature / linux (push) Successful in 3m0s
Native Rust workspace compile / compile (push) Failing after 6m12s
Skia feature / linux (push) Has been cancelled
This commit is contained in:
109
tools/check_milestone_10_issue_77.py
Normal file
109
tools/check_milestone_10_issue_77.py
Normal file
@@ -0,0 +1,109 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Audit issue 77's native MeshFoundry ownership and evidence boundary."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
import re
|
||||
|
||||
import generate_api_shims
|
||||
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
SOURCE = ROOT / "crates" / "libremetaverse-rendering-mesh-foundry" / "src" / "mesh_foundry.rs"
|
||||
GENERATED = ROOT / "crates" / "libremetaverse-rendering-mesh-foundry" / "src" / "generated.rs"
|
||||
MANIFEST = ROOT / "crates" / "libremetaverse-rendering-mesh-foundry" / "Cargo.toml"
|
||||
ASSET_TESTS = ROOT / "crates" / "libremetaverse-rendering-mesh-foundry" / "tests" / "mesh_assets.rs"
|
||||
COMPAT = ROOT / "tests" / "compat" / "tests" / "imaging_meshing_semantics.rs"
|
||||
BENCH = ROOT / "crates" / "libremetaverse-rendering-mesh-foundry" / "benches" / "mesh_decode.rs"
|
||||
WORKSPACE = ROOT / "Cargo.toml"
|
||||
DOC = ROOT / "crates" / "libremetaverse-rendering-mesh-foundry" / "README.md"
|
||||
STRUCTURED = ROOT / "crates" / "libremetaverse-structured-data" / "src" / "lib.rs"
|
||||
WORKFLOW = ROOT / ".gitea" / "workflows" / "rust-workspace.yml"
|
||||
STUB_RE = re.compile(r"\b(?:not_implemented|unimplemented_api)\b|\b(?:todo|unimplemented)!\s*\(")
|
||||
|
||||
TYPE = "T:LibreMetaverse.Rendering.MeshFoundry"
|
||||
MEMBERS = {
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.#ctor",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.GenerateFacetedMesh(LibreMetaverse.Primitive,LibreMetaverse.Rendering.DetailLevel)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.GenerateFacetedMeshMesh(LibreMetaverse.Primitive,System.Byte[])",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.GenerateFacetedMeshMesh(LibreMetaverse.Primitive,System.Byte[],LibreMetaverse.Rendering.DetailLevel)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.GenerateFacetedSculptMesh(LibreMetaverse.Primitive,LibreMetaverse.Imaging.ManagedImage,LibreMetaverse.Rendering.DetailLevel)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.GenerateSimpleMesh(LibreMetaverse.Primitive,LibreMetaverse.Rendering.DetailLevel)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.GenerateSimpleMeshWithNormals(LibreMetaverse.Primitive,LibreMetaverse.Rendering.DetailLevel)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.GenerateSimpleSculptMesh(LibreMetaverse.Primitive,LibreMetaverse.Imaging.ManagedImage,LibreMetaverse.Rendering.DetailLevel)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.MeshSubMeshAsConvexHulls(LibreMetaverse.Primitive,System.Byte[])",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.MeshSubMeshAsConvexHulls(LibreMetaverse.Primitive,System.Byte[],System.Collections.Generic.List{LibreMetaverse.Vector3}@)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.MeshSubMeshAsSimpleMesh(LibreMetaverse.Primitive,System.Byte[])",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.TerrainMesh(System.Single[0:,0:],System.Single,System.Single,System.Single,System.Single)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.TransformTexCoords(System.Collections.Generic.List{LibreMetaverse.Rendering.Vertex},LibreMetaverse.Vector3,LibreMetaverse.Primitive.TextureEntryFace,LibreMetaverse.Vector3)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.UnpackMesh(System.Byte[])",
|
||||
}
|
||||
|
||||
|
||||
def require_markers(path: Path, markers: tuple[str, ...]) -> None:
|
||||
text = path.read_text()
|
||||
missing = [marker for marker in markers if marker not in text]
|
||||
if missing:
|
||||
raise SystemExit(f"{path.name}: audit evidence missing: " + ", ".join(missing))
|
||||
|
||||
|
||||
def main() -> None:
|
||||
if generate_api_shims.NATIVE_DECLARATIONS.get(TYPE) != "crate::mesh_foundry::MeshFoundry":
|
||||
raise SystemExit("issue 77 MeshFoundry native declaration is missing")
|
||||
missing = sorted(MEMBERS - set(generate_api_shims.NATIVE_MEMBER_BODIES))
|
||||
if missing:
|
||||
raise SystemExit("issue 77 native members missing: " + ", ".join(missing))
|
||||
for source in (SOURCE, GENERATED):
|
||||
if STUB_RE.search(source.read_text()):
|
||||
raise SystemExit(f"issue 77 owned Rust stubs remain in {source.name}")
|
||||
|
||||
require_markers(SOURCE, (
|
||||
"impl IRendering for MeshFoundry", "SimpleRenderer", "SculptMesh::from_height_rows",
|
||||
"deserialize_llsd_binary_prefix", "ZlibDecoder", "select_lod", "decode_submesh",
|
||||
"TexCoord1", "Tangent", "generate_normals", "generate_tangents", "MeshFaceAux",
|
||||
"decode_skin", "decode_weights", "apply_sculpt_modifiers", "texture_for_face",
|
||||
"MAX_ASSET_BYTES", "MAX_TOTAL_VERTICES", "MAX_JOINTS", "checked_add",
|
||||
"mesh triangle index is out of range", "Error::Rendering",
|
||||
))
|
||||
manifest = MANIFEST.read_text()
|
||||
required_deps = (
|
||||
"flate2", "libremetaverse-prim-mesher", "libremetaverse-rendering-simple",
|
||||
"libremetaverse-structured-data", "stats_alloc",
|
||||
)
|
||||
missing_deps = [dependency for dependency in required_deps if dependency not in manifest]
|
||||
if missing_deps:
|
||||
raise SystemExit("issue 77 dependencies/evidence missing: " + ", ".join(missing_deps))
|
||||
|
||||
require_markers(ASSET_TESTS, (
|
||||
"model_workflow_asset_round_trips_and_falls_back_deterministically",
|
||||
"rigged_mesh_preserves_skin_uv_tangent_material_and_ordering_domains",
|
||||
"RiggedSkinMath::build_inv_bind_matrices", "compressed_submesh_decode_has_stable_golden_output",
|
||||
"0xcb32_07be_6dea_73c8", "rebases_indices_in_face_order",
|
||||
"convex_hulls_decode_bounding_and_decomposed_domains",
|
||||
"malformed_offsets_indices_and_weights_return_source_context",
|
||||
"mirror_and_invert_update_coordinates_normals_and_tangents",
|
||||
))
|
||||
require_markers(COMPAT, (
|
||||
"reviewed_meshfoundrytests_generatesimplemesh_box_returnsnonnull",
|
||||
"reviewed_meshfoundrytests_generatefacetedmesh_box_has6faces",
|
||||
"reviewed_meshfoundrytests_transformtexcoords_identitytransform_preservesuvs",
|
||||
"reviewed_meshfoundrytests_terrainmesh_allindicesinrange",
|
||||
))
|
||||
require_markers(BENCH, ("fixture(240)", "57_600", "342_726", "Region::new"))
|
||||
require_markers(WORKSPACE, ("[profile.benchmark]", 'opt-level = 1', "incremental = false"))
|
||||
require_markers(STRUCTURED, ("pub fn deserialize_llsd_binary_prefix", "binary::deserialize_prefix"))
|
||||
require_markers(DOC, (
|
||||
"prim-local coordinates", "MeshFaceAux", "bitangent", "UV1", "RiggedSkinMath",
|
||||
"exactly-four-influence", "XOR winding", "64 MiB", "65,536", "6,000,000",
|
||||
"source primitive UUID", "57,600-vertex",
|
||||
))
|
||||
require_markers(WORKFLOW, ("python3 tools/check_milestone_10_issue_77.py",))
|
||||
print(
|
||||
"issue 77 audit: native prim/sculpt/terrain and packed mesh pipelines, bounded LLSD/zlib, "
|
||||
"LOD, normals/tangents/UVs, materials, rigging, convex data, tests, benchmark, and docs are present"
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -504,9 +504,37 @@ NATIVE_DECLARATIONS = {
|
||||
"T:LibreMetaverse.Simulator": "crate::network_manager::Simulator",
|
||||
"T:LibreMetaverse.StructuredData.OSDParser": "crate::model::OSDParser",
|
||||
"T:LibreMetaverse.Rendering.SimpleRenderer": "crate::simple_renderer::SimpleRenderer",
|
||||
"T:LibreMetaverse.Rendering.MeshFoundry": "crate::mesh_foundry::MeshFoundry",
|
||||
}
|
||||
|
||||
NATIVE_MEMBER_BODIES = {
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.#ctor": "Self::native_new()",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.GenerateFacetedMesh(LibreMetaverse.Primitive,LibreMetaverse.Rendering.DetailLevel)":
|
||||
"self.native_generate_faceted_mesh(prim, lod)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.GenerateFacetedMeshMesh(LibreMetaverse.Primitive,System.Byte[])":
|
||||
"self.native_generate_faceted_mesh_mesh(prim, mesh_data, libremetaverse::rendering::DetailLevel::Highest)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.GenerateFacetedMeshMesh(LibreMetaverse.Primitive,System.Byte[],LibreMetaverse.Rendering.DetailLevel)":
|
||||
"self.native_generate_faceted_mesh_mesh(prim, mesh_data, lod)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.GenerateFacetedSculptMesh(LibreMetaverse.Primitive,LibreMetaverse.Imaging.ManagedImage,LibreMetaverse.Rendering.DetailLevel)":
|
||||
"self.native_generate_faceted_sculpt_mesh(prim, sculpt_texture, lod)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.GenerateSimpleMesh(LibreMetaverse.Primitive,LibreMetaverse.Rendering.DetailLevel)":
|
||||
"self.native_generate_simple_mesh(prim, lod, false)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.GenerateSimpleMeshWithNormals(LibreMetaverse.Primitive,LibreMetaverse.Rendering.DetailLevel)":
|
||||
"self.native_generate_simple_mesh(prim, lod, true)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.GenerateSimpleSculptMesh(LibreMetaverse.Primitive,LibreMetaverse.Imaging.ManagedImage,LibreMetaverse.Rendering.DetailLevel)":
|
||||
"self.native_generate_simple_sculpt_mesh(prim, sculpt_texture, lod)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.MeshSubMeshAsConvexHulls(LibreMetaverse.Primitive,System.Byte[])":
|
||||
"self.native_mesh_sub_mesh_as_convex_hulls(prim, compressed_mesh_data, None)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.MeshSubMeshAsConvexHulls(LibreMetaverse.Primitive,System.Byte[],System.Collections.Generic.List{LibreMetaverse.Vector3}@)":
|
||||
"self.native_mesh_sub_mesh_as_convex_hulls(prim, compressed_mesh_data, Some(bounding_hull))",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.MeshSubMeshAsSimpleMesh(LibreMetaverse.Primitive,System.Byte[])":
|
||||
"self.native_mesh_sub_mesh_as_simple_mesh(prim, compressed_mesh_data)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.TerrainMesh(System.Single[0:,0:],System.Single,System.Single,System.Single,System.Single)":
|
||||
"self.native_terrain_mesh(z_map, x_begin, x_end, y_begin, y_end)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.TransformTexCoords(System.Collections.Generic.List{LibreMetaverse.Rendering.Vertex},LibreMetaverse.Vector3,LibreMetaverse.Primitive.TextureEntryFace,LibreMetaverse.Vector3)":
|
||||
"self.native_transform_tex_coords(vertices, center, te_face, prim_scale)",
|
||||
"M:LibreMetaverse.Rendering.MeshFoundry.UnpackMesh(System.Byte[])":
|
||||
"self.native_unpack_mesh(asset_data).map(Some)",
|
||||
"M:LibreMetaverse.Rendering.SimpleRenderer.#ctor": "Self::native_new()",
|
||||
"M:LibreMetaverse.Rendering.SimpleRenderer.GenerateFacetedMesh(LibreMetaverse.Primitive,LibreMetaverse.Rendering.DetailLevel)":
|
||||
"self.native_generate_faceted_mesh(prim, lod)",
|
||||
|
||||
Reference in New Issue
Block a user