| 128 | |
| 129 | |
| 130 | class Constant(object): |
| 131 | def __init__(self, stream, string_table, version): |
| 132 | self.name = string_table.get_string(stream.read_uint32()) |
| 133 | self.offset = stream.read_uint32() |
| 134 | self.size = stream.read_uint32() |
| 135 | self.type = stream.read_uint8() |
| 136 | if version < 11: |
| 137 | if self.type in (0, 1): |
| 138 | pass |
| 139 | elif self.type == 2: |
| 140 | self.type = 3 |
| 141 | else: |
| 142 | self.type = 4 |
| 143 | self.dimension = stream.read_uint8() |
| 144 | self.elements = stream.read_uint32() |
| 145 | self.is_srgb = stream.read_uint8() != 0 |
| 146 | self.is_autoregister = stream.read_uint8() != 0 |
| 147 | self.default_value = None |
| 148 | self.trinity_type = None |
| 149 | if self.type == 0: # float |
| 150 | if self.elements > 1: |
| 151 | self.trinity_type = 'TriFloatArrayParameter' |
| 152 | else: |
| 153 | if self.dimension == 16 and 'Reflection' in self.name: |
| 154 | self.trinity_type = 'TriVariableParameter' |
| 155 | else: |
| 156 | self.trinity_type = _TRINITY_FLOAT_PARAMETERS.get(self.dimension) |
| 157 | |
| 158 | def read_default_value(self, data): |
| 159 | if self.type == 0: |
| 160 | value = [] |
| 161 | if self.elements > 1: |
| 162 | for i in range(self.elements): |
| 163 | value.append(struct.unpack_from('f', data, self.offset + 4 * i)[0]) |
| 164 | self.default_value = value |
| 165 | else: |
| 166 | for i in range(self.dimension): |
| 167 | try: |
| 168 | value.append(struct.unpack_from('f', data, self.offset + 4 * i)[0]) |
| 169 | except struct.error: |
| 170 | value.append(0.0) |
| 171 | if self.dimension == 16: |
| 172 | self.default_value = tuple(value[0:4]), tuple(value[4:9]), tuple(value[8:13]), tuple(value[12:16]) |
| 173 | elif self.dimension == 1: |
| 174 | self.default_value = value[0] |
| 175 | else: |
| 176 | self.default_value = tuple(value) |
| 177 | |
| 178 | |
| 179 | class Resource(object): |