Skip to content

Commit

Permalink
addon skin import and better material assignment
Browse files Browse the repository at this point in the history
  • Loading branch information
kainotoa committed Jul 9, 2021
1 parent 1f231bb commit eff92dc
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 65 deletions.
62 changes: 50 additions & 12 deletions i_scene_cp77_gltf/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@
from io_scene_gltf2.blender.imp.gltf2_blender_mesh import BlenderMesh
from .material_types.multilayer import Multilayered
import os
from .main.setup import createMaterials
from .main.setup import MaterialBuilder

class CP77Import(bpy.types.Operator,ImportHelper):
bl_idname = "io_scene_gltf.cp77"
bl_label = "Import glTF"
Expand Down Expand Up @@ -47,21 +48,58 @@ def execute(self, context):
gltf_importer.read()
gltf_importer.checks()


existingMeshes = bpy.data.meshes.keys()
existingObjects = bpy.data.objects.keys()
existingMaterials = bpy.data.materials.keys()

BlenderGlTF.create(gltf_importer)

for name in bpy.data.materials.keys():
if name not in existingMaterials:
bpy.data.materials.remove(bpy.data.materials[name], do_unlink=True, do_id_user=True, do_ui_user=True)

BasePath = os.path.splitext(self.filepath)[0] + "\\"
file = open(BasePath + "Material.json",mode='r')
obj = json.loads(file.read())
BasePath = str(obj["MaterialRepo"]) + "\\"
createMaterials(obj,BasePath,str(self.image_format))

BlenderGlTF.set_convert_functions(gltf_importer)
BlenderGlTF.pre_compute(gltf_importer)
for i in range(0,len(gltf_importer.data.meshes)):
bpymesh = BlenderMesh.create(gltf_importer,i,None)
bpymesh.materials.clear()
for e in range (0,len(gltf_importer.data.meshes[i].extras["materialNames"])):
bpymesh.materials.append(bpy.data.materials.get(gltf_importer.data.meshes[i].extras["materialNames"][e]))
mesh_object = bpy.data.objects.new(name=gltf_importer.data.meshes[i].name, object_data=bpymesh)
bpy.context.view_layer.active_layer_collection.collection.objects.link(mesh_object)

Builder = MaterialBuilder(obj,BasePath,str(self.image_format))

usedMaterials = {}
counter = 0
for name in bpy.data.meshes.keys():
if name not in existingMeshes:
bpy.data.meshes[name].materials.clear()
for matname in gltf_importer.data.meshes[counter].extras["materialNames"]:
if matname not in usedMaterials.keys():
index = 0
for rawmat in obj["Materials"]:
if rawmat["Name"] == matname:
bpymat = Builder.create(index)
bpy.data.meshes[name].materials.append(bpymat)
usedMaterials.update( {matname: bpymat} )
index = index + 1
else:
bpy.data.meshes[name].materials.append(usedMaterials[matname])

counter = counter + 1

index = 0
for rawmat in obj["Materials"]:
if rawmat["Name"] not in usedMaterials:
Builder.create(index)
index = index + 1


collection = bpy.data.collections.new(os.path.splitext(os.path.basename(self.filepath))[0])
bpy.context.scene.collection.children.link(collection)

for name in bpy.data.objects.keys():
if name not in existingObjects:
for parent in bpy.data.objects[name].users_collection:
parent.objects.unlink(bpy.data.objects[name])
collection.objects.link(bpy.data.objects[name])

return {'FINISHED'}

Expand Down
18 changes: 18 additions & 0 deletions i_scene_cp77_gltf/main/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,31 @@

def imageFromPath(Img,image_format,isNormal = False):
Im = bpy.data.images.get(os.path.basename(Img)[:-4])
if Im:
if Im.colorspace_settings.name != 'Non-Color':
if isNormal:
Im = None
else:
if not isNormal:
Im = None
if not Im:
Im = bpy.data.images.get(os.path.basename(Img)[:-4] + ".001")
if Im:
if Im.colorspace_settings.name != 'Non-Color':
if isNormal:
Im = None
else:
if not isNormal:
Im = None

if not Im:
Im = bpy.data.images.new(os.path.basename(Img)[:-4],1,1)
Im.source = "FILE"
Im.filepath = Img[:-3]+ image_format
if isNormal:
Im.colorspace_settings.name = 'Non-Color'
return Im

def crop_image(orig_img,outname, cropped_min_x, cropped_max_x, cropped_min_y, cropped_max_y):
'''Crops an image object of type <class 'bpy.types.Image'>. For example, for a 10x10 image,
if you put cropped_min_x = 2 and cropped_max_x = 6,
Expand Down
114 changes: 61 additions & 53 deletions i_scene_cp77_gltf/main/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,67 +11,75 @@
from ..material_types.meshdecalemissive import MeshDecalEmissive
from ..material_types.glass import Glass

def createMaterials(obj,BasePath,image_format):
class MaterialBuilder:
def __init__(self,Obj,BasePath,image_format):
self.BasePath = BasePath
self.image_format = image_format
self.obj = Obj
def create(self,materialIndex):
rawMat = self.obj["Materials"][materialIndex]

for rawMat in obj["Materials"]:
bpyMat = bpy.data.materials.new(rawMat["Name"])
bpyMat.use_nodes = True
if rawMat["MaterialType"] == "_multilayered":
mulLayer = Multilayered(BasePath,obj["MaterialTemplates"],image_format)
index = 0
for i in range (0,len(obj["MaterialSetups"])):
if str(os.path.basename(rawMat["_multilayered"].get("MultilayerSetup"))) == str(obj["MaterialSetups"][i]["Name"]):
index = i
globnormal = rawMat["_multilayered"].get("GlobalNormal")
mlmask = rawMat["_multilayered"].get("MultilayerMask")
mulLayer.create(obj["MaterialSetups"][index],mlmask,bpyMat,globnormal)
bpyMat = bpy.data.materials.new(rawMat["Name"])
bpyMat.use_nodes = True

if rawMat["MaterialType"] == "_mesh_decal":
if rawMat.get("_mesh_decal"):
mesDec = MeshDecal(BasePath,image_format)
mesDec.create(rawMat["_mesh_decal"],bpyMat)
if rawMat["MaterialType"] == "_multilayered":
mulLayer = Multilayered(self.BasePath,self.obj["MaterialTemplates"],self.image_format)
index = 0
for i in range (0,len(self.obj["MaterialSetups"])):
if str(os.path.basename(rawMat["_multilayered"].get("MultilayerSetup"))) == str(self.obj["MaterialSetups"][i]["Name"]):
index = i
globnormal = rawMat["_multilayered"].get("GlobalNormal")
mlmask = rawMat["_multilayered"].get("MultilayerMask")
mulLayer.create(self.obj["MaterialSetups"][index],mlmask,bpyMat,globnormal)

if rawMat["MaterialType"] == "_skin":
if rawMat.get("_skin"):
humskin = HumanSkin(BasePath,image_format)
humskin.create(rawMat["_skin"],bpyMat)
if rawMat["MaterialType"] == "_mesh_decal":
if rawMat.get("_mesh_decal"):
mesDec = MeshDecal(self.BasePath,self.image_format)
mesDec.create(rawMat["_mesh_decal"],bpyMat)

if rawMat["MaterialType"] == "_metal_base":
if rawMat.get("_metal_base"):
metbase = MetalBase(BasePath,image_format)
metbase.create(rawMat["_metal_base"],bpyMat)
if rawMat["MaterialType"] == "_skin":
if rawMat.get("_skin"):
humskin = HumanSkin(self.BasePath,self.image_format)
humskin.create(rawMat["_skin"],bpyMat)

if rawMat["MaterialType"] == "_hair":
if rawMat.get("_hair"):
h = Hair(BasePath,obj["HairProfiles"],image_format)
h.create(rawMat["_hair"],bpyMat)
if rawMat["MaterialType"] == "_metal_base":
if rawMat.get("_metal_base"):
metbase = MetalBase(self.BasePath,self.image_format)
metbase.create(rawMat["_metal_base"],bpyMat)

if rawMat["MaterialType"] == "_mesh_decal_gradientmap_recolor":
if rawMat.get("_mesh_decal_gradientmap_recolor"):
hC = MeshDecalGradientMapReColor(BasePath,image_format)
hC.create(rawMat["_mesh_decal_gradientmap_recolor"],bpyMat)
if rawMat["MaterialType"] == "_hair":
if rawMat.get("_hair"):
h = Hair(self.BasePath,self.obj["HairProfiles"],self.image_format)
h.create(rawMat["_hair"],bpyMat)

if rawMat["MaterialType"] == "_eye":
if rawMat.get("_eye"):
eye = Eye(BasePath,image_format)
eye.create(rawMat["_eye"],bpyMat)
if rawMat["MaterialType"] == "_mesh_decal_gradientmap_recolor":
if rawMat.get("_mesh_decal_gradientmap_recolor"):
hC = MeshDecalGradientMapReColor(self.BasePath,self.image_format)
hC.create(rawMat["_mesh_decal_gradientmap_recolor"],bpyMat)

if rawMat["MaterialType"] == "_eye_shadow":
if rawMat.get("_eye_shadow"):
eS = EyeShadow(BasePath,image_format)
eS.create(rawMat["_eye_shadow"],bpyMat)
if rawMat["MaterialType"] == "_eye":
if rawMat.get("_eye"):
eye = Eye(self.BasePath,self.image_format)
eye.create(rawMat["_eye"],bpyMat)

if rawMat["MaterialType"] == "_mesh_decal_emissive":
if rawMat.get("_mesh_decal_emissive"):
decEmiss = MeshDecalEmissive(BasePath,image_format)
decEmiss.create(rawMat["_mesh_decal_emissive"],bpyMat)
if rawMat["MaterialType"] == "_eye_shadow":
if rawMat.get("_eye_shadow"):
eS = EyeShadow(self.BasePath,self.image_format)
eS.create(rawMat["_eye_shadow"],bpyMat)

if rawMat["MaterialType"] == "_mesh_decal_wet_character":
if rawMat.get("_mesh_decal_wet_character"):
mesDec = MeshDecal(BasePath,image_format)
mesDec.create(rawMat["_mesh_decal_wet_character"],bpyMat)
if rawMat["MaterialType"] == "_mesh_decal_emissive":
if rawMat.get("_mesh_decal_emissive"):
decEmiss = MeshDecalEmissive(self.BasePath,self.image_format)
decEmiss.create(rawMat["_mesh_decal_emissive"],bpyMat)

if rawMat["MaterialType"] == "_glass":
if rawMat.get("_glass"):
glass = Glass(BasePath,image_format)
glass.create(rawMat["_glass"],bpyMat)
if rawMat["MaterialType"] == "_mesh_decal_wet_character":
if rawMat.get("_mesh_decal_wet_character"):
mesDec = MeshDecal(self.BasePath,self.image_format)
mesDec.create(rawMat["_mesh_decal_wet_character"],bpyMat)

if rawMat["MaterialType"] == "_glass":
if rawMat.get("_glass"):
glass = Glass(self.BasePath,self.image_format)
glass.create(rawMat["_glass"],bpyMat)

return bpyMat

0 comments on commit eff92dc

Please sign in to comment.