001/**
002 * Copyright (c) 2008-2014 Ardor Labs, Inc.
003 *
004 * This file is part of Ardor3D.
005 *
006 * Ardor3D is free software: you can redistribute it and/or modify it 
007 * under the terms of its license which may be found in the accompanying
008 * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
009 */
010
011package com.ardor3d.extension.model.md2;
012
013import com.ardor3d.math.Vector3;
014
015final class Md2Normals {
016    /** Pre-generated md2 normals. See also http://tfc.duke.free.fr/coding/src/anorms.h */
017    final static float[] NORMALS = { //
018    -0.525731f, 0.000000f, 0.850651f, //  
019            -0.442863f, 0.238856f, 0.864188f, //  
020            -0.295242f, 0.000000f, 0.955423f, //  
021            -0.309017f, 0.500000f, 0.809017f, //  
022            -0.162460f, 0.262866f, 0.951056f, //  
023            0.000000f, 0.000000f, 1.000000f, //  
024            0.000000f, 0.850651f, 0.525731f, //  
025            -0.147621f, 0.716567f, 0.681718f, //  
026            0.147621f, 0.716567f, 0.681718f, //  
027            0.000000f, 0.525731f, 0.850651f, //  
028            0.309017f, 0.500000f, 0.809017f, //  
029            0.525731f, 0.000000f, 0.850651f, //  
030            0.295242f, 0.000000f, 0.955423f, //  
031            0.442863f, 0.238856f, 0.864188f, //  
032            0.162460f, 0.262866f, 0.951056f, //  
033            -0.681718f, 0.147621f, 0.716567f, //  
034            -0.809017f, 0.309017f, 0.500000f, //  
035            -0.587785f, 0.425325f, 0.688191f, //  
036            -0.850651f, 0.525731f, 0.000000f, //  
037            -0.864188f, 0.442863f, 0.238856f, //  
038            -0.716567f, 0.681718f, 0.147621f, //  
039            -0.688191f, 0.587785f, 0.425325f, //  
040            -0.500000f, 0.809017f, 0.309017f, //  
041            -0.238856f, 0.864188f, 0.442863f, //  
042            -0.425325f, 0.688191f, 0.587785f, //  
043            -0.716567f, 0.681718f, -0.147621f, //  
044            -0.500000f, 0.809017f, -0.309017f, //  
045            -0.525731f, 0.850651f, 0.000000f, //  
046            0.000000f, 0.850651f, -0.525731f, //  
047            -0.238856f, 0.864188f, -0.442863f, //  
048            0.000000f, 0.955423f, -0.295242f, //  
049            -0.262866f, 0.951056f, -0.162460f, //  
050            0.000000f, 1.000000f, 0.000000f, //  
051            0.000000f, 0.955423f, 0.295242f, //  
052            -0.262866f, 0.951056f, 0.162460f, //  
053            0.238856f, 0.864188f, 0.442863f, //  
054            0.262866f, 0.951056f, 0.162460f, //  
055            0.500000f, 0.809017f, 0.309017f, //  
056            0.238856f, 0.864188f, -0.442863f, //  
057            0.262866f, 0.951056f, -0.162460f, //  
058            0.500000f, 0.809017f, -0.309017f, //  
059            0.850651f, 0.525731f, 0.000000f, //  
060            0.716567f, 0.681718f, 0.147621f, //  
061            0.716567f, 0.681718f, -0.147621f, //  
062            0.525731f, 0.850651f, 0.000000f, //  
063            0.425325f, 0.688191f, 0.587785f, //  
064            0.864188f, 0.442863f, 0.238856f, //  
065            0.688191f, 0.587785f, 0.425325f, //  
066            0.809017f, 0.309017f, 0.500000f, //  
067            0.681718f, 0.147621f, 0.716567f, //  
068            0.587785f, 0.425325f, 0.688191f, //  
069            0.955423f, 0.295242f, 0.000000f, //  
070            1.000000f, 0.000000f, 0.000000f, //  
071            0.951056f, 0.162460f, 0.262866f, //  
072            0.850651f, -0.525731f, 0.000000f, //  
073            0.955423f, -0.295242f, 0.000000f, //  
074            0.864188f, -0.442863f, 0.238856f, //  
075            0.951056f, -0.162460f, 0.262866f, //  
076            0.809017f, -0.309017f, 0.500000f, //  
077            0.681718f, -0.147621f, 0.716567f, //  
078            0.850651f, 0.000000f, 0.525731f, //  
079            0.864188f, 0.442863f, -0.238856f, //  
080            0.809017f, 0.309017f, -0.500000f, //  
081            0.951056f, 0.162460f, -0.262866f, //  
082            0.525731f, 0.000000f, -0.850651f, //  
083            0.681718f, 0.147621f, -0.716567f, //  
084            0.681718f, -0.147621f, -0.716567f, //  
085            0.850651f, 0.000000f, -0.525731f, //  
086            0.809017f, -0.309017f, -0.500000f, //  
087            0.864188f, -0.442863f, -0.238856f, //  
088            0.951056f, -0.162460f, -0.262866f, //  
089            0.147621f, 0.716567f, -0.681718f, //  
090            0.309017f, 0.500000f, -0.809017f, //  
091            0.425325f, 0.688191f, -0.587785f, //  
092            0.442863f, 0.238856f, -0.864188f, //  
093            0.587785f, 0.425325f, -0.688191f, //  
094            0.688191f, 0.587785f, -0.425325f, //  
095            -0.147621f, 0.716567f, -0.681718f, //  
096            -0.309017f, 0.500000f, -0.809017f, //  
097            0.000000f, 0.525731f, -0.850651f, //  
098            -0.525731f, 0.000000f, -0.850651f, //  
099            -0.442863f, 0.238856f, -0.864188f, //  
100            -0.295242f, 0.000000f, -0.955423f, //  
101            -0.162460f, 0.262866f, -0.951056f, //  
102            0.000000f, 0.000000f, -1.000000f, //  
103            0.295242f, 0.000000f, -0.955423f, //  
104            0.162460f, 0.262866f, -0.951056f, //  
105            -0.442863f, -0.238856f, -0.864188f, //  
106            -0.309017f, -0.500000f, -0.809017f, //  
107            -0.162460f, -0.262866f, -0.951056f, //  
108            0.000000f, -0.850651f, -0.525731f, //  
109            -0.147621f, -0.716567f, -0.681718f, //  
110            0.147621f, -0.716567f, -0.681718f, //  
111            0.000000f, -0.525731f, -0.850651f, //  
112            0.309017f, -0.500000f, -0.809017f, //  
113            0.442863f, -0.238856f, -0.864188f, //  
114            0.162460f, -0.262866f, -0.951056f, //  
115            0.238856f, -0.864188f, -0.442863f, //  
116            0.500000f, -0.809017f, -0.309017f, //  
117            0.425325f, -0.688191f, -0.587785f, //  
118            0.716567f, -0.681718f, -0.147621f, //  
119            0.688191f, -0.587785f, -0.425325f, //  
120            0.587785f, -0.425325f, -0.688191f, //  
121            0.000000f, -0.955423f, -0.295242f, //  
122            0.000000f, -1.000000f, 0.000000f, //  
123            0.262866f, -0.951056f, -0.162460f, //  
124            0.000000f, -0.850651f, 0.525731f, //  
125            0.000000f, -0.955423f, 0.295242f, //  
126            0.238856f, -0.864188f, 0.442863f, //  
127            0.262866f, -0.951056f, 0.162460f, //  
128            0.500000f, -0.809017f, 0.309017f, //  
129            0.716567f, -0.681718f, 0.147621f, //  
130            0.525731f, -0.850651f, 0.000000f, //  
131            -0.238856f, -0.864188f, -0.442863f, //  
132            -0.500000f, -0.809017f, -0.309017f, //  
133            -0.262866f, -0.951056f, -0.162460f, //  
134            -0.850651f, -0.525731f, 0.000000f, //  
135            -0.716567f, -0.681718f, -0.147621f, //  
136            -0.716567f, -0.681718f, 0.147621f, //  
137            -0.525731f, -0.850651f, 0.000000f, //  
138            -0.500000f, -0.809017f, 0.309017f, //  
139            -0.238856f, -0.864188f, 0.442863f, //  
140            -0.262866f, -0.951056f, 0.162460f, //  
141            -0.864188f, -0.442863f, 0.238856f, //  
142            -0.809017f, -0.309017f, 0.500000f, //  
143            -0.688191f, -0.587785f, 0.425325f, //  
144            -0.681718f, -0.147621f, 0.716567f, //  
145            -0.442863f, -0.238856f, 0.864188f, //  
146            -0.587785f, -0.425325f, 0.688191f, //  
147            -0.309017f, -0.500000f, 0.809017f, //  
148            -0.147621f, -0.716567f, 0.681718f, //  
149            -0.425325f, -0.688191f, 0.587785f, //  
150            -0.162460f, -0.262866f, 0.951056f, //  
151            0.442863f, -0.238856f, 0.864188f, //  
152            0.162460f, -0.262866f, 0.951056f, //  
153            0.309017f, -0.500000f, 0.809017f, //  
154            0.147621f, -0.716567f, 0.681718f, //  
155            0.000000f, -0.525731f, 0.850651f, //  
156            0.425325f, -0.688191f, 0.587785f, //  
157            0.587785f, -0.425325f, 0.688191f, //  
158            0.688191f, -0.587785f, 0.425325f, //  
159            -0.955423f, 0.295242f, 0.000000f, //  
160            -0.951056f, 0.162460f, 0.262866f, //  
161            -1.000000f, 0.000000f, 0.000000f, //  
162            -0.850651f, 0.000000f, 0.525731f, //  
163            -0.955423f, -0.295242f, 0.000000f, //  
164            -0.951056f, -0.162460f, 0.262866f, //  
165            -0.864188f, 0.442863f, -0.238856f, //  
166            -0.951056f, 0.162460f, -0.262866f, //  
167            -0.809017f, 0.309017f, -0.500000f, //  
168            -0.864188f, -0.442863f, -0.238856f, //  
169            -0.951056f, -0.162460f, -0.262866f, //  
170            -0.809017f, -0.309017f, -0.500000f, //  
171            -0.681718f, 0.147621f, -0.716567f, //  
172            -0.681718f, -0.147621f, -0.716567f, //  
173            -0.850651f, 0.000000f, -0.525731f, //  
174            -0.688191f, 0.587785f, -0.425325f, //  
175            -0.587785f, 0.425325f, -0.688191f, //  
176            -0.425325f, 0.688191f, -0.587785f, //  
177            -0.425325f, -0.688191f, -0.587785f, //  
178            -0.587785f, -0.425325f, -0.688191f, //  
179            -0.688191f, -0.587785f, -0.425325f //
180    };
181
182    public static void getNormalVector(final byte i, final Vector3 store) {
183        final int index = 3 * (i & 0xff);
184        if (index < 0 || index > Md2Normals.NORMALS.length) {
185            store.set(0, 1, 0);
186        } else {
187            store.set(Md2Normals.NORMALS[index + 0], Md2Normals.NORMALS[index + 1], Md2Normals.NORMALS[index + 2]);
188        }
189    }
190}