feat: enhance material creation to ensure Principled BSDF node exists and apply materials to exported objects

This commit is contained in:
MayaTheShy
2025-11-08 23:13:04 -05:00
parent a0a6371c29
commit fd6b9ec645

View File

@@ -1,5 +1,6 @@
import bpy import bpy
import os import os
import traceback
# Clear existing objects # Clear existing objects
bpy.ops.object.select_all(action='SELECT') bpy.ops.object.select_all(action='SELECT')
@@ -11,91 +12,122 @@ os.makedirs(output_dir, exist_ok=True)
def create_material(name, base_color): def create_material(name, base_color):
"""Create a PBR material with the specified base color (RGBA)""" """Create a PBR material with the specified base color (RGBA)"""
mat = bpy.data.materials.new(name=name) try:
mat.use_nodes = True mat = bpy.data.materials.new(name=name)
nodes = mat.node_tree.nodes mat.use_nodes = True
nodes = mat.node_tree.nodes
# Find the Principled BSDF node (should be created by default) # Find the Principled BSDF node (should be created by default)
bsdf = None bsdf = None
for node in nodes: for node in nodes:
if node.type == 'BSDF_PRINCIPLED': if node.type == 'BSDF_PRINCIPLED':
bsdf = node bsdf = node
break break
# If not found, create it # If not found, create it
if not bsdf: if not bsdf:
bsdf = nodes.new(type='ShaderNodeBsdfPrincipled') bsdf = nodes.new(type='ShaderNodeBsdfPrincipled')
# Set material properties # Set material properties
bsdf.inputs['Base Color'].default_value = base_color bsdf.inputs['Base Color'].default_value = base_color
bsdf.inputs['Roughness'].default_value = 0.5 bsdf.inputs['Roughness'].default_value = 0.5
bsdf.inputs['Metallic'].default_value = 0.1 bsdf.inputs['Metallic'].default_value = 0.1
return mat print(f" Created material '{name}' with color {base_color}")
return mat
except Exception as e:
print(f"ERROR creating material: {e}")
traceback.print_exc()
return None
print("Creating GREEN sphere...") try:
# Create and export UV Sphere with GREEN material print("Creating GREEN sphere...")
bpy.ops.mesh.primitive_uv_sphere_add(segments=32, ring_count=16, radius=0.5, location=(0, 0, 0)) # Create and export UV Sphere with GREEN material
sphere = bpy.context.active_object bpy.ops.mesh.primitive_uv_sphere_add(segments=32, ring_count=16, radius=0.5, location=(0, 0, 0))
sphere.name = "Sphere" sphere = bpy.context.active_object
sphere.select_set(True) sphere.name = "Sphere"
bpy.context.view_layer.objects.active = sphere sphere.select_set(True)
bpy.ops.object.shade_smooth() bpy.context.view_layer.objects.active = sphere
# Apply green material bpy.ops.object.shade_smooth()
green_mat = create_material("SphereMaterial", (0.2, 1.0, 0.2, 1.0)) # Green
sphere.data.materials.append(green_mat)
sphere_path = os.path.join(output_dir, "sphere.glb")
bpy.ops.export_scene.gltf(
filepath=sphere_path,
export_format='GLB',
use_selection=True
)
print(f"✓ Exported sphere.glb (GREEN) to {sphere_path}")
print("Creating RED cube...") # Apply green material
# Delete sphere and create cube with RED material green_mat = create_material("SphereMaterial", (0.2, 1.0, 0.2, 1.0)) # Green
bpy.ops.object.delete(use_global=False) if green_mat:
bpy.ops.mesh.primitive_cube_add(size=1.0, location=(0, 0, 0)) sphere.data.materials.append(green_mat)
cube = bpy.context.active_object
cube.name = "Cube"
cube.select_set(True)
bpy.context.view_layer.objects.active = cube
bpy.ops.object.shade_smooth()
# Apply red material
red_mat = create_material("CubeMaterial", (1.0, 0.2, 0.2, 1.0)) # Red
cube.data.materials.append(red_mat)
cube_path = os.path.join(output_dir, "cube.glb")
bpy.ops.export_scene.gltf(
filepath=cube_path,
export_format='GLB',
use_selection=True
)
print(f"✓ Exported cube.glb (RED) to {cube_path}")
print("Creating BLUE icosphere...") sphere_path = os.path.join(output_dir, "sphere.glb")
# Delete cube and create ico sphere for the "model" placeholder with BLUE material print(f" Exporting to {sphere_path}...")
bpy.ops.object.delete(use_global=False) bpy.ops.export_scene.gltf(
bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=2, radius=0.5, location=(0, 0, 0)) filepath=sphere_path,
ico = bpy.context.active_object export_format='GLB',
ico.name = "IcoSphere" use_selection=True
ico.select_set(True) )
bpy.context.view_layer.objects.active = ico print(f"✓ Exported sphere.glb (GREEN)")
bpy.ops.object.shade_smooth() except Exception as e:
# Apply blue material print(f"ERROR with sphere: {e}")
blue_mat = create_material("IcoSphereMaterial", (0.2, 0.2, 1.0, 1.0)) # Blue traceback.print_exc()
ico.data.materials.append(blue_mat)
model_path = os.path.join(output_dir, "model.glb") try:
bpy.ops.export_scene.gltf( print("\nCreating RED cube...")
filepath=model_path, # Delete sphere and create cube with RED material
export_format='GLB', bpy.ops.object.delete(use_global=False)
use_selection=True bpy.ops.mesh.primitive_cube_add(size=1.0, location=(0, 0, 0))
) cube = bpy.context.active_object
print(f"✓ Exported model.glb (BLUE) to {model_path}") cube.name = "Cube"
cube.select_set(True)
bpy.context.view_layer.objects.active = cube
bpy.ops.object.shade_smooth()
# Apply red material
red_mat = create_material("CubeMaterial", (1.0, 0.2, 0.2, 1.0)) # Red
if red_mat:
cube.data.materials.append(red_mat)
cube_path = os.path.join(output_dir, "cube.glb")
print(f" Exporting to {cube_path}...")
bpy.ops.export_scene.gltf(
filepath=cube_path,
export_format='GLB',
use_selection=True
)
print(f"✓ Exported cube.glb (RED)")
except Exception as e:
print(f"ERROR with cube: {e}")
traceback.print_exc()
try:
print("\nCreating BLUE icosphere...")
# Delete cube and create ico sphere for the "model" placeholder with BLUE material
bpy.ops.object.delete(use_global=False)
bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=2, radius=0.5, location=(0, 0, 0))
ico = bpy.context.active_object
ico.name = "IcoSphere"
ico.select_set(True)
bpy.context.view_layer.objects.active = ico
bpy.ops.object.shade_smooth()
# Apply blue material
blue_mat = create_material("IcoSphereMaterial", (0.2, 0.2, 1.0, 1.0)) # Blue
if blue_mat:
ico.data.materials.append(blue_mat)
model_path = os.path.join(output_dir, "model.glb")
print(f" Exporting to {model_path}...")
bpy.ops.export_scene.gltf(
filepath=model_path,
export_format='GLB',
use_selection=True
)
print(f"✓ Exported model.glb (BLUE)")
except Exception as e:
print(f"ERROR with icosphere: {e}")
traceback.print_exc()
print("\n" + "="*60) print("\n" + "="*60)
print("ALL PRIMITIVE MODELS WITH COLORS EXPORTED SUCCESSFULLY!") print("EXPORT COMPLETE!")
print("="*60) print("="*60)
print(f" RED Cube: {os.path.join(output_dir, 'cube.glb')}") print(f"Output directory: {output_dir}")
print(f" GREEN Sphere: {os.path.join(output_dir, 'sphere.glb')}") print(" - cube.glb (RED)")
print(f" BLUE IcoSphere: {os.path.join(output_dir, 'model.glb')}") print(" - sphere.glb (GREEN)")
print(" - model.glb (BLUE)")
print("="*60) print("="*60)