xrforge/manyfold/root/hook.d/experience_updated/1000-extract-textures.rb

82 lines
2.4 KiB
Ruby
Executable file

#!/usr/bin/env ruby
require 'json'
require_relative './../../xrforge.rb'
# Check if a filename is provided
if ARGV.length != 1
puts "Usage: #{$0} <path/to/experience/somefile.xxx>"
exit 1
end
filename = ARGV[0]
require 'base64'
require 'json'
begin
# Change the directory
dir = File.dirname(filename)
Dir.chdir( dir )
# Read and parse the JSON file
data = JSON.parse( File.read( "datapackage.json" ) )
logfile = File.join( File.dirname(filename), ".xrforge/log.txt" )
data['resources'].each do |resource|
ext = File.extname(resource['path'])
filenameWithoutExt = File.basename(resource['path'], ext)
if ! XRForge::MODEL_EXT.any?( ext )
next # skip unknown 3d files
end
if ! resource['path'].match(/^[a-zA-Z0-9]/)
next # skip filenames like '_generated.glb' e.g. (produced by hooks)
end
XRForge.log("✅ unpacking textures", logfile)
gltf_path = ".xrforge/#{filenameWithoutExt}.gltf"
system("assimp export #{resource['path']} #{gltf_path} --embed-textures")
Dir.chdir("#{dir}/.xrforge")
system("assimp extract #{filenameWithoutExt}.gltf | sed 's|/.*/||g'")
Dir.chdir(dir)
# Read and parse the GLTF JSON
gltf = JSON.parse(File.read(gltf_path))
# Ensure images section exists
unless gltf['images'] && gltf['images'].is_a?(Array)
puts "✅ No 'images' array found in #{gltf_path}"
next
end
# Iterate through the images array
gltf['images'].each_with_index do |img, i|
imgExts = ["jpg","png"]
new_filename = "#{dir}/#{filenameWithoutExt}_img#{i}"
old_filename = "#{dir}/.xrforge/#{filenameWithoutExt}_img#{i}"
imgExts.each do |imgExt|
# move file to modeldirectory (but dont overwrite if user overwrite it)
if File.exist?("#{old_filename}.#{imgExt}") && !File.exist?("#{new_filename}.#{imgExt}")
puts "✅ Renaming #{old_filename}.#{imgExt} -> #{new_filename}.#{imgExt}"
File.rename( "#{old_filename}.#{imgExt}", "#{new_filename}.#{imgExt}" )
else
if File.exist?("#{new_filename}.#{imgExt}")
puts "✅ Not overwriting (useruploaded) #{new_filename}.#{imgExt}"
end
end
end
end
end
XRForge.log(" ", logfile)
rescue Errno::ENOENT
puts "File #{filename} not found"
rescue JSON::ParserError
puts "Error parsing JSON from #{filename}"
rescue => e
puts "An error occurred: #{e.message}"
end