{
  "measured_on": "2026-09-15",
  "question": "what happens to a texture when only the model file is sent on",
  "object": "a 20 mm box carrying real UVs and a flat 64 by 64 pixel texture of RGB (200, 60, 60), chosen saturated so that any substituted default is obvious in the mean pixel value",
  "method": "Each format is exported into an empty folder, so every file that appears is one the exporter decided it needed. The folder contents, the sizes and the outward-pointing lines are read off disk. The model is then loaded in place, and separately copied on its own into a second empty folder and loaded again, which is what happens when someone sends 'the model'.",
  "trimesh_version": "5.1.0",
  "numpy_version": "2.5.2",
  "authored_texture": {
    "size_px": [
      64,
      64
    ],
    "mean_rgb": [
      200,
      60,
      60
    ]
  },
  "rows": [
    {
      "format": "obj",
      "files_written": 3,
      "file_names": [
        "material.mtl",
        "material_0.png",
        "model.obj"
      ],
      "file_sizes_bytes": {
        "material.mtl": 198,
        "material_0.png": 184,
        "model.obj": 759
      },
      "main_file_bytes": 759,
      "sidecar_files": [
        "material.mtl",
        "material_0.png"
      ],
      "in_place_texture_size": "64 x 64",
      "in_place_texture_mean_rgb": [
        200.0,
        60.0,
        60.0
      ],
      "in_place_is_authored_texture": true,
      "after_move_texture_size": "2 x 2",
      "after_move_texture_mean_rgb": [
        100.0,
        100.0,
        100.0
      ],
      "after_move_is_authored_texture": false,
      "image_bytes_inside_main_file": false,
      "files_holding_image_bytes": [
        "material_0.png"
      ],
      "reference_chain": {
        "model.obj": [
          "mtllib material.mtl",
          "usemtl material_0"
        ],
        "material.mtl": [
          "newmtl material_0",
          "map_Kd material_0.png"
        ]
      },
      "reference_hops": 2,
      "in_place": {
        "loaded": true,
        "error": null,
        "warnings": [],
        "texture_size_px": [
          64,
          64
        ],
        "texture_mean_rgb": [
          200.0,
          60.0,
          60.0
        ],
        "is_the_authored_texture": true,
        "uv_count": 8
      },
      "after_moving_only_the_model": {
        "loaded": true,
        "error": null,
        "warnings": [],
        "texture_size_px": [
          2,
          2
        ],
        "texture_mean_rgb": [
          100.0,
          100.0,
          100.0
        ],
        "is_the_authored_texture": false,
        "uv_count": 8
      },
      "texture_survives_being_sent_alone": false,
      "reader_complained_when_it_broke": false
    },
    {
      "format": "glb",
      "files_written": 1,
      "file_names": [
        "model.glb"
      ],
      "file_sizes_bytes": {
        "model.glb": 1720
      },
      "main_file_bytes": 1720,
      "sidecar_files": [],
      "in_place_texture_size": "64 x 64",
      "in_place_texture_mean_rgb": [
        200.0,
        60.0,
        60.0
      ],
      "in_place_is_authored_texture": true,
      "after_move_texture_size": "64 x 64",
      "after_move_texture_mean_rgb": [
        200.0,
        60.0,
        60.0
      ],
      "after_move_is_authored_texture": true,
      "image_bytes_inside_main_file": true,
      "files_holding_image_bytes": [
        "model.glb"
      ],
      "reference_chain": {},
      "reference_hops": 0,
      "in_place": {
        "loaded": true,
        "error": null,
        "warnings": [],
        "texture_size_px": [
          64,
          64
        ],
        "texture_mean_rgb": [
          200.0,
          60.0,
          60.0
        ],
        "is_the_authored_texture": true,
        "uv_count": 8
      },
      "after_moving_only_the_model": {
        "loaded": true,
        "error": null,
        "warnings": [],
        "texture_size_px": [
          64,
          64
        ],
        "texture_mean_rgb": [
          200.0,
          60.0,
          60.0
        ],
        "is_the_authored_texture": true,
        "uv_count": 8
      },
      "texture_survives_being_sent_alone": true,
      "reader_complained_when_it_broke": false
    },
    {
      "format": "ply",
      "files_written": 1,
      "file_names": [
        "model.ply"
      ],
      "file_sizes_bytes": {
        "model.ply": 628
      },
      "main_file_bytes": 628,
      "sidecar_files": [],
      "in_place_texture_size": "2 x 2",
      "in_place_texture_mean_rgb": [
        100.0,
        100.0,
        100.0
      ],
      "in_place_is_authored_texture": false,
      "after_move_texture_size": "2 x 2",
      "after_move_texture_mean_rgb": [
        100.0,
        100.0,
        100.0
      ],
      "after_move_is_authored_texture": false,
      "image_bytes_inside_main_file": false,
      "files_holding_image_bytes": [],
      "reference_chain": {},
      "reference_hops": 0,
      "in_place": {
        "loaded": true,
        "error": null,
        "warnings": [],
        "texture_size_px": [
          2,
          2
        ],
        "texture_mean_rgb": [
          100.0,
          100.0,
          100.0
        ],
        "is_the_authored_texture": false,
        "uv_count": 8
      },
      "after_moving_only_the_model": {
        "loaded": true,
        "error": null,
        "warnings": [],
        "texture_size_px": [
          2,
          2
        ],
        "texture_mean_rgb": [
          100.0,
          100.0,
          100.0
        ],
        "is_the_authored_texture": false,
        "uv_count": 8
      },
      "texture_survives_being_sent_alone": false,
      "reader_complained_when_it_broke": false
    },
    {
      "format": "stl",
      "files_written": 1,
      "file_names": [
        "model.stl"
      ],
      "file_sizes_bytes": {
        "model.stl": 684
      },
      "main_file_bytes": 684,
      "sidecar_files": [],
      "in_place_texture_size": null,
      "in_place_texture_mean_rgb": null,
      "in_place_is_authored_texture": false,
      "after_move_texture_size": null,
      "after_move_texture_mean_rgb": null,
      "after_move_is_authored_texture": false,
      "image_bytes_inside_main_file": false,
      "files_holding_image_bytes": [],
      "reference_chain": {},
      "reference_hops": 0,
      "in_place": {
        "loaded": true,
        "error": null,
        "warnings": [],
        "texture_size_px": null,
        "texture_mean_rgb": null,
        "is_the_authored_texture": false,
        "uv_count": 0
      },
      "after_moving_only_the_model": {
        "loaded": true,
        "error": null,
        "warnings": [],
        "texture_size_px": null,
        "texture_mean_rgb": null,
        "is_the_authored_texture": false,
        "uv_count": 0
      },
      "texture_survives_being_sent_alone": false,
      "reader_complained_when_it_broke": false
    },
    {
      "format": "3mf",
      "files_written": 1,
      "file_names": [
        "model.3mf"
      ],
      "file_sizes_bytes": {
        "model.3mf": 1291
      },
      "main_file_bytes": 1291,
      "sidecar_files": [],
      "in_place_texture_size": null,
      "in_place_texture_mean_rgb": null,
      "in_place_is_authored_texture": false,
      "after_move_texture_size": null,
      "after_move_texture_mean_rgb": null,
      "after_move_is_authored_texture": false,
      "image_bytes_inside_main_file": false,
      "files_holding_image_bytes": [],
      "reference_chain": {},
      "reference_hops": 0,
      "in_place": {
        "loaded": true,
        "error": null,
        "warnings": [],
        "texture_size_px": null,
        "texture_mean_rgb": null,
        "is_the_authored_texture": false,
        "uv_count": 0
      },
      "after_moving_only_the_model": {
        "loaded": true,
        "error": null,
        "warnings": [],
        "texture_size_px": null,
        "texture_mean_rgb": null,
        "is_the_authored_texture": false,
        "uv_count": 0
      },
      "texture_survives_being_sent_alone": false,
      "reader_complained_when_it_broke": false
    }
  ],
  "not_measured_here": [
    "What each program substitutes for a texture it cannot find. The library used here returns a two pixel stand-in; Blender shows the material's diffuse colour, many engines show white, and some viewers show magenta on purpose. The format level fact is the one in the table: the bytes are not in the file and the reference is a bare relative filename. What gets drawn instead is the reader's choice.",
    "Case sensitivity, which cannot be shown on the machine this ran on. Windows resolves a reference to Texture.PNG against a file named texture.png and Linux does not, so an OBJ that works on the desktop it was made on can lose its texture the moment it reaches a Linux server or a web viewer. This is a real and common failure and it needs a Linux run to measure rather than an assertion here.",
    "COLLADA, which references textures the same way OBJ does and would belong in the table. The library used here cannot write it without an optional dependency, so it is left out rather than guessed at.",
    "Whether the texture is correct, as opposed to present. A surviving image still has to line up with the UVs, and nothing here checks that the model looks right, only that the picture arrived.",
    "The difference between what a format permits and what this exporter wrote. 3MF has a materials and properties extension that can carry a texture inside the archive, and PLY files from scan software often carry a TextureFile comment naming an image beside them. Neither was written here, so those two rows say that the file produced arrived without a texture, not that the format is incapable of one. The OBJ and GLB rows are the format level result, because referencing and embedding respectively are what those two formats do by design."
  ]
}
