]> git.tdb.fi Git - libs/gl.git/blob - blender/io_mspgl/material.py
Add a missing file
[libs/gl.git] / blender / io_mspgl / material.py
1 class MaterialMap:
2         def __init__(self, materials):
3                 self.technique = materials[0].technique
4                 self.name = "material_map_"+self.technique
5                 self.materials = materials
6                 self.srgb_colors = materials[0].srgb_colors
7                 for m in self.materials:
8                         if m.technique!=self.technique:
9                                 raise Exception("Conflicting techniques in MaterialMap constructor")
10                         if m.srgb_colors!=self.srgb_colors:
11                                 raise Exception("Conflicting colorspace settings in MaterialMap constructor")
12
13                 count = len(self.materials)
14                 size = 1
15                 while size*size*2<count:
16                         size *= 2
17                 if size*size>=count:
18                         self.size = (size, size)
19                 else:
20                         self.size = (size*2, size)
21
22                 from .util import get_colormap
23
24                 cm = get_colormap(self.srgb_colors)
25                 self.diffuse_data = ""
26                 for m in self.materials:
27                         diff = [int(cm(c)*255) for c in m.diffuse_color*m.diffuse_intensity]
28                         self.diffuse_data += "\\x{:02X}\\x{:02X}\\x{:02X}\\x{:02X}".format(*diff, int(m.ambient*255))
29                 self.diffuse_data += "\\x00\\x00\\x00\\x00"*(self.size[0]*self.size[1]-count)
30
31         def get_material_uv(self, material):
32                 index = self.materials.index(material)
33                 x = index%self.size[0]
34                 y = index//self.size[0]
35                 return ((x+0.5)/self.size[0], (y+0.5)/self.size[1])
36
37 def create_material_map(context, material):
38         if not material.material_map:
39                 raise Exception("Material is not part of a material map")
40
41         tech = material.technique
42         materials = []
43         for m in context.blend_data.materials:
44                 if m.material_map and m.technique==tech:
45                         materials.append(m)
46
47         mat_map = MaterialMap(materials)
48
49         return mat_map