lightwave exporter/importer- multiple UVs? Shapekeys?

mhmm…seems part1 stil waits for moderation aproval…

anyway, part3:



# =================================================
# === Generate Polygon Tag Mapping (PTAG Chunk) ===
# =================================================
def generate_ptag(mesh, material_names):
    
    def surf_indicies(mat):
        try:
            if mat:
                return material_names.index(mat.name)
        except:
            pass
        
        return 0
        
    
    data = cStringIO.StringIO()
    data.write("SURF")  # polygon tag type
    mesh_materials = mesh.materials
    mesh_surfindicies = [surf_indicies(mat) for mat in mesh_materials]
    
    try:    VCOL_NAME_SURF_INDEX = material_names.index(VCOL_NAME)
    except:    VCOL_NAME_SURF_INDEX = 0
    
    try:    DEFAULT_NAME_SURF_INDEX = material_names.index(DEFAULT_NAME)
    except:    DEFAULT_NAME_SURF_INDEX = 0
    len_mat = len(mesh_materials)
    for i, f in enumerate(mesh.faces): # numfaces
        f_mat = f.mat
        if f_mat >= len_mat: f_mat = 0 # Rare annoying eror
            
        
        if not i%100:
            Blender.Window.DrawProgressBar(float(i)/len(mesh.faces), "Writing Surface Indices")
        
        data.write(generate_vx(i))
        if (not mesh_materials) and mesh.vertexColors:        # vcols only
            surfidx = VCOL_NAME_SURF_INDEX
        elif mesh_materials and not mesh.vertexColors:        # materials only
            surfidx = mesh_surfindicies[f_mat]
        elif (not mesh_materials) and (not mesh.vertexColors):    # neither
            surfidx = DEFAULT_NAME_SURF_INDEX
        else:                                                # both
            surfidx = mesh_surfindicies[f_mat]
        
        data.write(struct.pack(">H", surfidx)) # surface index
    return data.getvalue()

# ===================================================
# === Generate VC Surface Definition (SURF Chunk) ===
# ===================================================
def generate_vcol_surf(mesh):
    data = cStringIO.StringIO()
    if mesh.vertexColors:
        surface_name = generate_nstring(VCOL_NAME)
    data.write(surface_name)
    data.write("\0\0")

    data.write("COLR")
    data.write(struct.pack(">H", 14))
    data.write(struct.pack(">fffH", 1, 1, 1, 0))

    data.write("DIFF")
    data.write(struct.pack(">H", 6))
    data.write(struct.pack(">fH", 0.0, 0))

    data.write("LUMI")
    data.write(struct.pack(">H", 6))
    data.write(struct.pack(">fH", 1.0, 0))

    data.write("VCOL")
    data.write(struct.pack(">H", 34))
    data.write(struct.pack(">fH4s", 1.0, 0, "RGB "))  # intensity, envelope, type
    data.write(generate_nstring("Blender's Vertex Colors")) # name

    data.write("CMNT")  # material comment
    comment = "Vertex Colors: Exported from Blender\256 243"
    comment = generate_nstring(comment)
    data.write(struct.pack(">H", len(comment)))
    data.write(comment)
    return data.getvalue()

# ================================================
 # === Generate Surface Definition (SURF Chunk) ===
 # ================================================
 def generate_surf(material_name):
     data = cStringIO.StringIO()
     data.write(generate_nstring(material_name))
     data.write("\0\0")
     
     try:
         material = Blender.Material.Get(material_name)
         R,G,B = material.R, material.G, material.B
         ref = material.ref
         emit = material.emit
         spec = material.spec
         hard = material.hard
         
     except:
         material = None
         
         R=G=B = 1.0
         ref = 1.0
         emit = 0.0
         spec = 0.2
         hard = 0.0
     
         
     data.write("COLR")
     data.write(struct.pack(">H", 14))
     data.write(struct.pack(">fffH", R, G, B, 0))
 
     data.write("DIFF")
     data.write(struct.pack(">H", 6))
     data.write(struct.pack(">fH", ref, 0))
 
     data.write("LUMI")
     data.write(struct.pack(">H", 6))
     data.write(struct.pack(">fH", emit, 0))
 
     data.write("SPEC")
     data.write(struct.pack(">H", 6))
     data.write(struct.pack(">fH", spec, 0))
 
     data.write("GLOS")
     data.write(struct.pack(">H", 6))
     gloss = hard / (255/2.0)
     gloss = round(gloss, 1)
     data.write(struct.pack(">fH", gloss, 0))
 
     data.write("CMNT")  # material comment
     comment = material_name + ": Exported from Blender\256 243"
     comment = generate_nstring(comment)
     data.write(struct.pack(">H", len(comment)))
     data.write(comment)
     
     # Check if the material contains any image maps
     if material:
         mtextures = material.getTextures()                                    # Get a list of textures linked to the material
         for mtex in mtextures:
             if (mtex) and (mtex.tex.type == Blender.Texture.Types.IMAGE):    # Check if the texture is of type "IMAGE"
                 data.write("BLOK")                  # Surface BLOK header
                 data.write(struct.pack(">H", 104))  # Hardcoded and ugly! Will only handle 1 image per material
 
                 # IMAP subchunk (image map sub header)
                 data.write("IMAP")                  
                 data_tmp = cStringIO.StringIO()
                 data_tmp.write(struct.pack(">H", 0))  # Hardcoded - not sure what it represents
                 data_tmp.write("CHAN")
                 data_tmp.write(struct.pack(">H", 4))
                 data_tmp.write("COLR")
                 data_tmp.write("OPAC")                # Hardcoded texture layer opacity
                 data_tmp.write(struct.pack(">H", 8))
                 data_tmp.write(struct.pack(">H", 0))
                 data_tmp.write(struct.pack(">f", 1.0))
                 data_tmp.write(struct.pack(">H", 0))
                 data_tmp.write("ENAB")
                 data_tmp.write(struct.pack(">HH", 2, 1))  # 1 = texture layer enabled
                 data_tmp.write("NEGA")
                 data_tmp.write(struct.pack(">HH", 2, 0))  # Disable negative image (1 = invert RGB values)
                 data_tmp.write("AXIS")
                 data_tmp.write(struct.pack(">HH", 2, 1))
                 data.write(struct.pack(">H", len(data_tmp.getvalue())))
                 data.write(data_tmp.getvalue())
 
                 # IMAG subchunk
                 data.write("IMAG")
                 data.write(struct.pack(">HH", 2, 1))
                 data.write("PROJ")
                 data.write(struct.pack(">HH", 2, 5)) # UV projection
 
                 data.write("VMAP")
                 uvname = generate_nstring("Blender's UV Coordinates")
                 data.write(struct.pack(">H", len(uvname)))
                 data.write(uvname)
 
     return data.getvalue()