mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-23 21:02:50 +00:00
78bfd30648
I'd forgotten I hadn't implemented exporting vertex normals. While I've modified things for making better use of blender's tools and avoiding the unnecessary use of objects, the code is taken from the ajmdl blender 2.4 export script.
97 lines
4.4 KiB
Python
97 lines
4.4 KiB
Python
# vim:ts=4:et
|
|
# ##### BEGIN GPL LICENSE BLOCK #####
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
#
|
|
# ##### END GPL LICENSE BLOCK #####
|
|
|
|
# <pep8 compliant>
|
|
|
|
from mathutils import Vector
|
|
|
|
# Covert normals to quake's normal palette. Implementation taken from ajmdl
|
|
#
|
|
# AJA: I use the following shortcuts to speed up normal lookup:
|
|
#
|
|
# Firstly, a preliminary match only uses the first quadrant
|
|
# (where all coords are >= 0). Then we use the appropriate
|
|
# normal index for the actual quadrant. We can do this because
|
|
# the 162 MDL/MD2 normals are not arbitrary but are mirrored in
|
|
# every quadrant. The eight numbers in the lists above are the
|
|
# indices for each quadrant (+++ ++- +-+ +-- -++ -+- --+ ---).
|
|
#
|
|
# Secondly we use the axis with the greatest magnitude (of the
|
|
# incoming normal) to search an axis-specific group, which means
|
|
# we only need to check about 1/3rd of the normals.
|
|
# Actually, about 1/14th (taniwha)
|
|
x_group = (
|
|
(Vector((1.0000, 0.0000, 0.0000)), (52,52,52,52,143,143,143,143)),
|
|
(Vector((0.9554, 0.2952, 0.0000)), (51,51,55,55,141,141,145,145)),
|
|
(Vector((0.9511, 0.1625, 0.2629)), (53,63,57,70,142,148,146,151)),
|
|
(Vector((0.8642, 0.4429, 0.2389)), (46,61,56,69,19,147,123,150)),
|
|
(Vector((0.8507, 0.5257, 0.0000)), (41,41,54,54,18,18,116,116)),
|
|
(Vector((0.8507, 0.0000, 0.5257)), (60,67,60,67,144,155,144,155)),
|
|
(Vector((0.8090, 0.3090, 0.5000)), (48,62,58,68,16,149,124,152)),
|
|
(Vector((0.7166, 0.6817, 0.1476)), (42,43,111,100,20,25,118,117)),
|
|
(Vector((0.6882, 0.5878, 0.4253)), (47,76,140,101,21,156,125,161)),
|
|
(Vector((0.6817, 0.1476, 0.7166)), (49,65,59,66,15,153,126,154)),
|
|
(Vector((0.5878, 0.4253, 0.6882)), (50,75,139,102,17,157,128,160)) )
|
|
y_group = (
|
|
(Vector((0.0000, 1.0000, 0.0000)), (32,32,104,104,32,32,104,104)),
|
|
(Vector((0.0000, 0.9554, 0.2952)), (33,30,107,103,33,30,107,103)),
|
|
(Vector((0.2629, 0.9511, 0.1625)), (36,39,109,105,34,31,122,115)),
|
|
(Vector((0.2389, 0.8642, 0.4429)), (35,38,108,97,23,29,121,113)),
|
|
(Vector((0.5257, 0.8507, 0.0000)), (44,44,112,112,27,27,119,119)),
|
|
(Vector((0.0000, 0.8507, 0.5257)), (6,28,106,90,6,28,106,90)),
|
|
(Vector((0.5000, 0.8090, 0.3090)), (37,40,110,98,22,26,120,114)),
|
|
(Vector((0.1476, 0.7166, 0.6817)), (8,71,136,92,7,77,130,91)),
|
|
(Vector((0.4253, 0.6882, 0.5878)), (45,73,138,99,24,158,131,159)),
|
|
(Vector((0.7166, 0.6817, 0.1476)), (42,43,111,100,20,25,118,117)),
|
|
(Vector((0.6882, 0.5878, 0.4253)), (47,76,140,101,21,156,125,161)) )
|
|
z_group = (
|
|
(Vector((0.0000, 0.0000, 1.0000)), (5,84,5,84,5,84,5,84)),
|
|
(Vector((0.2952, 0.0000, 0.9554)), (12,85,12,85,2,82,2,82)),
|
|
(Vector((0.1625, 0.2629, 0.9511)), (14,86,134,96,4,83,132,89)),
|
|
(Vector((0.4429, 0.2389, 0.8642)), (13,74,133,95,1,81,127,87)),
|
|
(Vector((0.5257, 0.0000, 0.8507)), (11,64,11,64,0,80,0,80)),
|
|
(Vector((0.0000, 0.5257, 0.8507)), (9,79,137,93,9,79,137,93)),
|
|
(Vector((0.3090, 0.5000, 0.8090)), (10,72,135,94,3,78,129,88)),
|
|
(Vector((0.6817, 0.1476, 0.7166)), (49,65,59,66,15,153,126,154)),
|
|
(Vector((0.5878, 0.4253, 0.6882)), (50,75,139,102,17,157,128,160)),
|
|
(Vector((0.1476, 0.7166, 0.6817)), (8,71,136,92,7,77,130,91)),
|
|
(Vector((0.4253, 0.6882, 0.5878)), (45,73,138,99,24,158,131,159)) )
|
|
|
|
def map_normal(n):
|
|
fn = Vector((abs(n.x),abs(n.y),abs(n.z)));
|
|
group = x_group
|
|
if fn.y > fn.x and fn.y > fn.z:
|
|
group = y_group
|
|
if fn.z > fn.x and fn.z > fn.y:
|
|
group = z_group
|
|
best = 0
|
|
best_dot = -1
|
|
for i in range(len(group)):
|
|
dot = group[i][0].dot(fn)
|
|
if dot > best_dot:
|
|
best = i
|
|
best_dot = dot
|
|
quadrant = 0
|
|
if n.x < 0:
|
|
quadrant += 4
|
|
if n.y < 0:
|
|
quadrant += 2
|
|
if n.z < 0:
|
|
quadrant += 1
|
|
return group[best][1][quadrant]
|