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
110 lines
6.5 KiB
Python
110 lines
6.5 KiB
Python
#!/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()
|