mirror of
https://github.com/isledecomp/isle.git
synced 2026-01-24 00:31:16 +00:00
address feedback
move vec.h to thirdparty folder update vec.h move all realtime code to realtime folder move calclocaltransform out of legoutil and into realtime cast shift to MxS32 add additional unroll hack to CalcLocalTransform to prevent msvc entropy
This commit is contained in:
parent
1a87f89e8b
commit
346c8387f5
335
LEGO1/vec.h → 3rdparty/vec/vec.h
vendored
335
LEGO1/vec.h → 3rdparty/vec/vec.h
vendored
@ -2,111 +2,125 @@
|
|||||||
* vec.h -- Vector macros for 2,3, and 4 dimensions,
|
* vec.h -- Vector macros for 2,3, and 4 dimensions,
|
||||||
* for any combination of C scalar types.
|
* for any combination of C scalar types.
|
||||||
*
|
*
|
||||||
* Author: Don Hatch (hatch@sgi.com)
|
* Author: Don Hatch (hatch@sgi.com)
|
||||||
* Last modified: Fri Sep 30 03:23:02 PDT 1994
|
* Last modified: Fri Dec 15 01:57:07 PST 1995
|
||||||
*
|
*
|
||||||
* General description:
|
* General description:
|
||||||
*
|
*
|
||||||
* The macro name describes its arguments; e.g.
|
* The macro name describes its arguments; e.g.
|
||||||
* MXS3 is "matrix times scalar in 3 dimensions";
|
* MXS3 is "matrix times scalar in 3 dimensions";
|
||||||
* VMV2 is "vector minus vector in 2 dimensions".
|
* VMV2 is "vector minus vector in 2 dimensions".
|
||||||
*
|
*
|
||||||
* If the result of an operation is a scalar, then the macro "returns"
|
* If the result of an operation is a scalar, then the macro "returns"
|
||||||
* the value; e.g.
|
* the value; e.g.
|
||||||
* result = DOT3(v,w);
|
* result = DOT3(v,w);
|
||||||
* result = DET4(m);
|
* result = DET4(m);
|
||||||
*
|
*
|
||||||
* If the result of an operation is a vector or matrix, then
|
* If the result of an operation is a vector or matrix, then
|
||||||
* the first argument is the destination; e.g.
|
* the first argument is the destination; e.g.
|
||||||
* SET2(tovec, fromvec);
|
* SET2(tovec, fromvec);
|
||||||
* MXM3(result, m1, m2);
|
* MXM3(result, m1, m2);
|
||||||
*
|
*
|
||||||
* WARNING: For the operations that are not done "componentwise"
|
* WARNING: For the operations that are not done "componentwise"
|
||||||
* (e.g. vector cross products and matrix multiplies)
|
* (e.g. vector cross products and matrix multiplies)
|
||||||
* the destination should not be either of the arguments,
|
* the destination should not be either of the arguments,
|
||||||
* for obvious reasons. For example, the following is wrong:
|
* for obvious reasons. For example, the following is wrong:
|
||||||
* VXM2(v,v,m);
|
* VXM2(v,v,m);
|
||||||
* For such "unsafe" macros, there are safe versions provided,
|
* For such "unsafe" macros, there are safe versions provided,
|
||||||
* but you have to specify a type for the temporary
|
* but you have to specify a type for the temporary
|
||||||
* result vector or matrix. For example, the safe versions
|
* result vector or matrix. For example, the safe versions
|
||||||
* of VXM2 are:
|
* of VXM2 are:
|
||||||
* VXM2d(v,v,m) if v's scalar type is double or float
|
* VXM2d(v,v,m) if v's scalar type is double or float
|
||||||
* VXM2i(v,v,m) if v's scalar type is int or char
|
* VXM2i(v,v,m) if v's scalar type is int or char
|
||||||
* VXM2l(v,v,m) if v's scalar type is long
|
* VXM2l(v,v,m) if v's scalar type is long
|
||||||
* VXM2r(v,v,m) if v's scalar type is real
|
* VXM2r(v,v,m) if v's scalar type is real
|
||||||
* VXM2safe(type,v,v,m) for other scalar types.
|
* VXM2safe(type,v,v,m) for other scalar types.
|
||||||
* These "safe" macros do not evaluate to C expressions
|
*
|
||||||
* (so, for example, they can't be used inside the parentheses of
|
* These "safe" macros and INVERTMAT do not evaluate to C expressions
|
||||||
* a for(...)).
|
* (so, for example, they can't be used inside the parentheses of
|
||||||
|
* a for(...)).
|
||||||
*
|
*
|
||||||
* Specific descriptions:
|
* Specific descriptions:
|
||||||
*
|
*
|
||||||
* The "?"'s in the following can be 2, 3, or 4.
|
* The "?"'s in the following can be 2, 3, or 4.
|
||||||
*
|
*
|
||||||
* SET?(to,from) to = from
|
* EXPAND?(v) comma-separated list of elements of v
|
||||||
* SETMAT?(to,from) to = from
|
|
||||||
* ROUNDVEC?(to,from) to = from with entries rounded
|
|
||||||
* to nearest integer
|
|
||||||
* ROUNDMAT?(to,from) to = from with entries rounded
|
|
||||||
* to nearest integer
|
|
||||||
* FILLVEC?(v,s) set each entry of vector v to be s
|
|
||||||
* FILLMAT?(m,s) set each entry of matrix m to be s
|
|
||||||
* ZEROVEC?(v) v = 0
|
|
||||||
* ISZEROVEC?(v) v == 0
|
|
||||||
* EQVEC?(v,w) v == w
|
|
||||||
* EQMAT?(m1,m2) m1 == m2
|
|
||||||
* ZEROMAT?(m) m = 0
|
|
||||||
* IDENTMAT?(m) m = 1
|
|
||||||
* TRANSPOSE?(to,from) (matrix to) = (transpose of matrix from)
|
|
||||||
* ADJOINT?(to,from) (matrix to) = (adjoint of matrix from)
|
|
||||||
* i.e. its determinant times its inverse
|
|
||||||
*
|
*
|
||||||
* V{P,M}V?(to,v,w) to = v {+,-} w
|
* SET?(to,from) to = from
|
||||||
* M{P,M}M?(to,m1,m2) to = m1 {+,-} m2
|
* SETMAT?(to,from) to = from
|
||||||
* SX{V,M}?(to,s,from) to = s * from
|
* ROUNDVEC?(to,from) to = from with entries rounded
|
||||||
* M{V,M}?(to,from) to = -from
|
* to nearest integer
|
||||||
* {V,M}{X,D}S?(to,from,s) to = from {*,/} s
|
* ROUNDMAT?(to,from) to = from with entries rounded
|
||||||
* MXM?(to,m1,m2) to = m1 * m2
|
* to nearest integer
|
||||||
* VXM?(to,v,m) (row vec to) = (row vec v) * m
|
* FILLVEC?(v,s) set each entry of vector v to be s
|
||||||
* MXV?(to,m,v) (column vec to) = m * (column vec v)
|
* FILLMAT?(m,s) set each entry of matrix m to be s
|
||||||
* LERP?(to,v0,v1,t) to = v0 + t*(v1-v0)
|
* ZEROVEC?(v) v = 0
|
||||||
|
* ISZEROVEC?(v) v == 0
|
||||||
|
* EQVEC?(v,w) v == w
|
||||||
|
* EQMAT?(m1,m2) m1 == m2
|
||||||
|
* ZEROMAT?(m) m = 0
|
||||||
|
* IDENTMAT?(m) m = 1
|
||||||
|
* TRANSPOSE?(to,from) (matrix to) = (transpose of matrix from)
|
||||||
|
* ADJOINT?(to,from) (matrix to) = (adjoint of matrix from)
|
||||||
|
* i.e. its determinant times its inverse
|
||||||
|
* INVERTMAT?{d,i,l,r}(to,from) (matrix to) = (inverse of matrix from)
|
||||||
|
* with temp adjoint and determinant type
|
||||||
|
* double, int, long, or real respectively
|
||||||
*
|
*
|
||||||
* DET?(m) determinant of m
|
* V{P,M}V?(to,v,w) to = v {+,-} w
|
||||||
* TRACE?(m) trace (sum of diagonal entries) of m
|
* M{P,M}M?(to,m1,m2) to = m1 {+,-} m2
|
||||||
* DOT?(v,w) dot (scalar) product of v and w
|
* SX{V,M}?(to,s,from) to = s * from
|
||||||
* NORMSQRD?(v) square of |v|
|
* VPSXV?(to,v,s,w) to = v + s*w
|
||||||
* DISTSQRD?(v,w) square of |v-w|
|
* VPVXS?(to,v,w,s) to = v + w*s
|
||||||
|
* M{V,M}?(to,from) to = -from
|
||||||
|
* {V,M}{X,D}S?(to,from,s) to = from {*,/} s
|
||||||
|
* MXM?(to,m1,m2) to = m1 * m2
|
||||||
|
* VXM?(to,v,m) (row vec to) = (row vec v) * m
|
||||||
|
* MXV?(to,m,v) (column vec to) = m * (column vec v)
|
||||||
|
* VMODS?(to,v,s) to = v mod s (always >= 0)
|
||||||
|
* VMODV?(to,v0,v1) to = v0 mod v1 componentwise
|
||||||
|
* VDIVS?(to,v,s) to = (v-(v mod s))/s
|
||||||
|
* VDIVV?(to,v0,v1) to = (v0-(v0 mod v1))/v1 componentwise
|
||||||
|
* V{MIN,MAX}S?(to,v,s) to = {MIN,MAX}(v, s)
|
||||||
|
* V{MIN,MAX}V?(to,v0,v1) to = {MIN,MAX}(v0, v1)
|
||||||
|
* LERP?(to,v0,v1,t) to = v0 + t*(v1-v0)
|
||||||
*
|
*
|
||||||
* XV2(to,v) to = v rotated by 90 degrees
|
* DET?(m) determinant of m
|
||||||
* VXV3(to,v1,v2) to = cross (vector) product of v1 and v2
|
* TRACE?(m) trace (sum of diagonal entries) of m
|
||||||
* VXVXV4(to,v1,v2,v3) to = 4-dimensional vector cross product
|
* DOT?(v,w) dot (scalar) product of v and w
|
||||||
* of v1,v2,v3 (a vector orthogonal to
|
* NORMSQRD?(v) square of |v|
|
||||||
* v1,v2,v3 whose length equals the
|
* DISTSQRD?(v,w) square of |v-w|
|
||||||
* volume of the spanned parallelotope)
|
*
|
||||||
* VXV2(v0,v1) determinant of matrix with rows v0,v1
|
* XV2(to,v) to = v rotated by 90 degrees
|
||||||
* VXVXV3(v0,v1,v2) determinant of matrix with rows v0,v1,v2
|
* VXV3(to,v1,v2) to = cross (vector) product of v1 and v2
|
||||||
* VXVXVXV4(v0,v1,v2,v3) determinant of matrix with rows v0,..,v3
|
* VXVXV4(to,v1,v2,v3) to = 4-dimensional vector cross product
|
||||||
|
* of v1,v2,v3 (a vector orthogonal to
|
||||||
|
* v1,v2,v3 whose length equals the
|
||||||
|
* volume of the spanned parallelotope)
|
||||||
|
* VXV2(v0,v1) determinant of matrix with rows v0,v1
|
||||||
|
* VXVXV3(v0,v1,v2) determinant of matrix with rows v0,v1,v2
|
||||||
|
* VXVXVXV4(v0,v1,v2,v3) determinant of matrix with rows v0,..,v3
|
||||||
*
|
*
|
||||||
* The following macros mix objects from different dimensions.
|
* The following macros mix objects from different dimensions.
|
||||||
* For example, V3XM4 would be used to apply a composite
|
* For example, V3XM4 would be used to apply a composite
|
||||||
* 4x4 rotation-and-translation matrix to a 3d vector.
|
* 4x4 rotation-and-translation matrix to a 3d vector.
|
||||||
*
|
*
|
||||||
* SET3from2(to,from,pad) (3d vec to) = (2d vec from) with pad
|
* SET3from2(to,from,pad) (3d vec to) = (2d vec from) with pad
|
||||||
* SET4from3(to,from,pad) (4d vec to) = (3d vec from) with pad
|
* SET4from3(to,from,pad) (4d vec to) = (3d vec from) with pad
|
||||||
* SETMAT3from2(to,from,pad0,pad1) (3x3 mat to) = (2x2 mat from)
|
* SETMAT3from2(to,from,pad0,pad1) (3x3 mat to) = (2x2 mat from)
|
||||||
* padded with pad0 on the sides
|
* padded with pad0 on the sides
|
||||||
* and pad1 in the corner
|
* and pad1 in the corner
|
||||||
* SETMAT4from3(to,from,pad0,pad1) (4x4 mat to) = (3x3 mat from)
|
* SETMAT4from3(to,from,pad0,pad1) (4x4 mat to) = (3x3 mat from)
|
||||||
* padded with pad0 on the sides
|
* padded with pad0 on the sides
|
||||||
* and pad1 in the corner
|
* and pad1 in the corner
|
||||||
* V2XM3(to2,v2,m3) (2d row vec to2) = (2d row vec v2) * (3x3 mat m3)
|
* V2XM3(to2,v2,m3) (2d row vec to2) = (2d row vec v2) * (3x3 mat m3)
|
||||||
* V3XM4(to3,v3,m4) (3d row vec to3) = (3d row vec v2) * (4x4 mat m4)
|
* V3XM4(to3,v3,m4) (3d row vec to3) = (3d row vec v2) * (4x4 mat m4)
|
||||||
* M3XV2(to2,m3,v2) (2d col vec to2) = (3x3 mat m3) * (2d col vec v2)
|
* M3XV2(to2,m3,v2) (2d col vec to2) = (3x3 mat m3) * (2d col vec v2)
|
||||||
* M4XV3(to3,m4,v3) (3d col vec to3) = (4x4 mat m4) * (3d col vec v3)
|
* M4XV3(to3,m4,v3) (3d col vec to3) = (4x4 mat m4) * (3d col vec v3)
|
||||||
* M2XM3(to3,m2,m3) (3x3 mat to3) = (2x2 mat m2) * (3x3 mat m3)
|
* M2XM3(to3,m2,m3) (3x3 mat to3) = (2x2 mat m2) * (3x3 mat m3)
|
||||||
* M3XM4(to4,m3,m4) (4x4 mat to4) = (3x3 mat m3) * (4x4 mat m4)
|
* M3XM4(to4,m3,m4) (4x4 mat to4) = (3x3 mat m3) * (4x4 mat m4)
|
||||||
* M3XM2(to3,m3,m2) (3x3 mat to3) = (3x3 mat m3) * (2x2 mat m2)
|
* M3XM2(to3,m3,m2) (3x3 mat to3) = (3x3 mat m3) * (2x2 mat m2)
|
||||||
* M4XM3(to4,m4,m3) (4x4 mat to4) = (4x4 mat m4) * (3x3 mat m3)
|
* M4XM3(to4,m4,m3) (4x4 mat to4) = (4x4 mat m4) * (3x3 mat m3)
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This file is machine-generated and can be regenerated
|
* This file is machine-generated and can be regenerated
|
||||||
@ -116,7 +130,10 @@
|
|||||||
|
|
||||||
#ifndef VEC_H
|
#ifndef VEC_H
|
||||||
#define VEC_H 4
|
#define VEC_H 4
|
||||||
#include <math.h> /* for definition of floor() */
|
#include <math.h> /* for definition of floor() */
|
||||||
|
#define EXPAND2(v) (v)[0], (v)[1]
|
||||||
|
#define EXPAND3(v) (v)[0], (v)[1], (v)[2]
|
||||||
|
#define EXPAND4(v) (v)[0], (v)[1], (v)[2], (v)[3]
|
||||||
#define SET2(to,from) \
|
#define SET2(to,from) \
|
||||||
((to)[0] = (from)[0], \
|
((to)[0] = (from)[0], \
|
||||||
(to)[1] = (from)[1])
|
(to)[1] = (from)[1])
|
||||||
@ -156,6 +173,12 @@
|
|||||||
#define TRANSPOSE2(to,from) \
|
#define TRANSPOSE2(to,from) \
|
||||||
(_SETcol2((to)[0], from, 0), \
|
(_SETcol2((to)[0], from, 0), \
|
||||||
_SETcol2((to)[1], from, 1))
|
_SETcol2((to)[1], from, 1))
|
||||||
|
#define VPSXV2(to,v,s,w) \
|
||||||
|
((to)[0] = (v)[0] + (s) * (w)[0], \
|
||||||
|
(to)[1] = (v)[1] + (s) * (w)[1])
|
||||||
|
#define VPVXS2(to,v,w,s) \
|
||||||
|
((to)[0] = (v)[0] + (w)[0] * (s), \
|
||||||
|
(to)[1] = (v)[1] + (w)[1] * (s))
|
||||||
#define VPV2(to,v,w) \
|
#define VPV2(to,v,w) \
|
||||||
((to)[0] = (v)[0] + (w)[0], \
|
((to)[0] = (v)[0] + (w)[0], \
|
||||||
(to)[1] = (v)[1] + (w)[1])
|
(to)[1] = (v)[1] + (w)[1])
|
||||||
@ -201,6 +224,30 @@
|
|||||||
#define MXV2(to,m,v) \
|
#define MXV2(to,m,v) \
|
||||||
((to)[0] = DOT2((m)[0], v), \
|
((to)[0] = DOT2((m)[0], v), \
|
||||||
(to)[1] = DOT2((m)[1], v))
|
(to)[1] = DOT2((m)[1], v))
|
||||||
|
#define VMODS2(to,v,s) \
|
||||||
|
((to)[0] = SMODS1((v)[0], s), \
|
||||||
|
(to)[1] = SMODS1((v)[1], s))
|
||||||
|
#define VMODV2(to,v0,v1) \
|
||||||
|
((to)[0] = SMODS1((v0)[0], (v1)[0]), \
|
||||||
|
(to)[1] = SMODS1((v0)[1], (v1)[1]))
|
||||||
|
#define VDIVS2(to,v,s) \
|
||||||
|
((to)[0] = SDIVS1((v)[0], s), \
|
||||||
|
(to)[1] = SDIVS1((v)[1], s))
|
||||||
|
#define VDIVV2(to,v0,v1) \
|
||||||
|
((to)[0] = SDIVS1((v0)[0], (v1)[0]), \
|
||||||
|
(to)[1] = SDIVS1((v0)[1], (v1)[1]))
|
||||||
|
#define VMINS2(to,v,s) \
|
||||||
|
((to)[0] = SMINS1((v)[0], s), \
|
||||||
|
(to)[1] = SMINS1((v)[1], s))
|
||||||
|
#define VMINV2(to,v0,v1) \
|
||||||
|
((to)[0] = SMINS1((v0)[0], (v1)[0]), \
|
||||||
|
(to)[1] = SMINS1((v0)[1], (v1)[1]))
|
||||||
|
#define VMAXS2(to,v,s) \
|
||||||
|
((to)[0] = SMAXS1((v)[0], s), \
|
||||||
|
(to)[1] = SMAXS1((v)[1], s))
|
||||||
|
#define VMAXV2(to,v0,v1) \
|
||||||
|
((to)[0] = SMAXS1((v0)[0], (v1)[0]), \
|
||||||
|
(to)[1] = SMAXS1((v0)[1], (v1)[1]))
|
||||||
#define LERP2(to,v0,v1,t) \
|
#define LERP2(to,v0,v1,t) \
|
||||||
((to)[0]=(v0)[0]+(t)*((v1)[0]-(v0)[0]), \
|
((to)[0]=(v0)[0]+(t)*((v1)[0]-(v0)[0]), \
|
||||||
(to)[1]=(v0)[1]+(t)*((v1)[1]-(v0)[1]))
|
(to)[1]=(v0)[1]+(t)*((v1)[1]-(v0)[1]))
|
||||||
@ -243,6 +290,14 @@
|
|||||||
(_DET2(v0,v1,0,1))
|
(_DET2(v0,v1,0,1))
|
||||||
#define DET2(m) \
|
#define DET2(m) \
|
||||||
(VXV2((m)[0],(m)[1]))
|
(VXV2((m)[0],(m)[1]))
|
||||||
|
#define SMODS1(a,b) \
|
||||||
|
((((a)%(b)+(b))%(b)))
|
||||||
|
#define SDIVS1(a,b) \
|
||||||
|
((((a)-SMODS1(a,b))/(b)))
|
||||||
|
#define SMINS1(a,b) \
|
||||||
|
(((a) < (b) ? (a) : (b)))
|
||||||
|
#define SMAXS1(a,b) \
|
||||||
|
(((a) > (b) ? (a) : (b)))
|
||||||
#define ADJOINT2(to,m) \
|
#define ADJOINT2(to,m) \
|
||||||
( _ADJOINTcol2(to,0,m,1), \
|
( _ADJOINTcol2(to,0,m,1), \
|
||||||
__ADJOINTcol2(to,1,m,0))
|
__ADJOINTcol2(to,1,m,0))
|
||||||
@ -304,6 +359,14 @@
|
|||||||
(_SETcol3((to)[0], from, 0), \
|
(_SETcol3((to)[0], from, 0), \
|
||||||
_SETcol3((to)[1], from, 1), \
|
_SETcol3((to)[1], from, 1), \
|
||||||
_SETcol3((to)[2], from, 2))
|
_SETcol3((to)[2], from, 2))
|
||||||
|
#define VPSXV3(to,v,s,w) \
|
||||||
|
((to)[0] = (v)[0] + (s) * (w)[0], \
|
||||||
|
(to)[1] = (v)[1] + (s) * (w)[1], \
|
||||||
|
(to)[2] = (v)[2] + (s) * (w)[2])
|
||||||
|
#define VPVXS3(to,v,w,s) \
|
||||||
|
((to)[0] = (v)[0] + (w)[0] * (s), \
|
||||||
|
(to)[1] = (v)[1] + (w)[1] * (s), \
|
||||||
|
(to)[2] = (v)[2] + (w)[2] * (s))
|
||||||
#define VPV3(to,v,w) \
|
#define VPV3(to,v,w) \
|
||||||
((to)[0] = (v)[0] + (w)[0], \
|
((to)[0] = (v)[0] + (w)[0], \
|
||||||
(to)[1] = (v)[1] + (w)[1], \
|
(to)[1] = (v)[1] + (w)[1], \
|
||||||
@ -364,6 +427,38 @@
|
|||||||
((to)[0] = DOT3((m)[0], v), \
|
((to)[0] = DOT3((m)[0], v), \
|
||||||
(to)[1] = DOT3((m)[1], v), \
|
(to)[1] = DOT3((m)[1], v), \
|
||||||
(to)[2] = DOT3((m)[2], v))
|
(to)[2] = DOT3((m)[2], v))
|
||||||
|
#define VMODS3(to,v,s) \
|
||||||
|
((to)[0] = SMODS1((v)[0], s), \
|
||||||
|
(to)[1] = SMODS1((v)[1], s), \
|
||||||
|
(to)[2] = SMODS1((v)[2], s))
|
||||||
|
#define VMODV3(to,v0,v1) \
|
||||||
|
((to)[0] = SMODS1((v0)[0], (v1)[0]), \
|
||||||
|
(to)[1] = SMODS1((v0)[1], (v1)[1]), \
|
||||||
|
(to)[2] = SMODS1((v0)[2], (v1)[2]))
|
||||||
|
#define VDIVS3(to,v,s) \
|
||||||
|
((to)[0] = SDIVS1((v)[0], s), \
|
||||||
|
(to)[1] = SDIVS1((v)[1], s), \
|
||||||
|
(to)[2] = SDIVS1((v)[2], s))
|
||||||
|
#define VDIVV3(to,v0,v1) \
|
||||||
|
((to)[0] = SDIVS1((v0)[0], (v1)[0]), \
|
||||||
|
(to)[1] = SDIVS1((v0)[1], (v1)[1]), \
|
||||||
|
(to)[2] = SDIVS1((v0)[2], (v1)[2]))
|
||||||
|
#define VMINS3(to,v,s) \
|
||||||
|
((to)[0] = SMINS1((v)[0], s), \
|
||||||
|
(to)[1] = SMINS1((v)[1], s), \
|
||||||
|
(to)[2] = SMINS1((v)[2], s))
|
||||||
|
#define VMINV3(to,v0,v1) \
|
||||||
|
((to)[0] = SMINS1((v0)[0], (v1)[0]), \
|
||||||
|
(to)[1] = SMINS1((v0)[1], (v1)[1]), \
|
||||||
|
(to)[2] = SMINS1((v0)[2], (v1)[2]))
|
||||||
|
#define VMAXS3(to,v,s) \
|
||||||
|
((to)[0] = SMAXS1((v)[0], s), \
|
||||||
|
(to)[1] = SMAXS1((v)[1], s), \
|
||||||
|
(to)[2] = SMAXS1((v)[2], s))
|
||||||
|
#define VMAXV3(to,v0,v1) \
|
||||||
|
((to)[0] = SMAXS1((v0)[0], (v1)[0]), \
|
||||||
|
(to)[1] = SMAXS1((v0)[1], (v1)[1]), \
|
||||||
|
(to)[2] = SMAXS1((v0)[2], (v1)[2]))
|
||||||
#define LERP3(to,v0,v1,t) \
|
#define LERP3(to,v0,v1,t) \
|
||||||
((to)[0]=(v0)[0]+(t)*((v1)[0]-(v0)[0]), \
|
((to)[0]=(v0)[0]+(t)*((v1)[0]-(v0)[0]), \
|
||||||
(to)[1]=(v0)[1]+(t)*((v1)[1]-(v0)[1]), \
|
(to)[1]=(v0)[1]+(t)*((v1)[1]-(v0)[1]), \
|
||||||
@ -509,6 +604,16 @@
|
|||||||
_SETcol4((to)[1], from, 1), \
|
_SETcol4((to)[1], from, 1), \
|
||||||
_SETcol4((to)[2], from, 2), \
|
_SETcol4((to)[2], from, 2), \
|
||||||
_SETcol4((to)[3], from, 3))
|
_SETcol4((to)[3], from, 3))
|
||||||
|
#define VPSXV4(to,v,s,w) \
|
||||||
|
((to)[0] = (v)[0] + (s) * (w)[0], \
|
||||||
|
(to)[1] = (v)[1] + (s) * (w)[1], \
|
||||||
|
(to)[2] = (v)[2] + (s) * (w)[2], \
|
||||||
|
(to)[3] = (v)[3] + (s) * (w)[3])
|
||||||
|
#define VPVXS4(to,v,w,s) \
|
||||||
|
((to)[0] = (v)[0] + (w)[0] * (s), \
|
||||||
|
(to)[1] = (v)[1] + (w)[1] * (s), \
|
||||||
|
(to)[2] = (v)[2] + (w)[2] * (s), \
|
||||||
|
(to)[3] = (v)[3] + (w)[3] * (s))
|
||||||
#define VPV4(to,v,w) \
|
#define VPV4(to,v,w) \
|
||||||
((to)[0] = (v)[0] + (w)[0], \
|
((to)[0] = (v)[0] + (w)[0], \
|
||||||
(to)[1] = (v)[1] + (w)[1], \
|
(to)[1] = (v)[1] + (w)[1], \
|
||||||
@ -584,6 +689,46 @@
|
|||||||
(to)[1] = DOT4((m)[1], v), \
|
(to)[1] = DOT4((m)[1], v), \
|
||||||
(to)[2] = DOT4((m)[2], v), \
|
(to)[2] = DOT4((m)[2], v), \
|
||||||
(to)[3] = DOT4((m)[3], v))
|
(to)[3] = DOT4((m)[3], v))
|
||||||
|
#define VMODS4(to,v,s) \
|
||||||
|
((to)[0] = SMODS1((v)[0], s), \
|
||||||
|
(to)[1] = SMODS1((v)[1], s), \
|
||||||
|
(to)[2] = SMODS1((v)[2], s), \
|
||||||
|
(to)[3] = SMODS1((v)[3], s))
|
||||||
|
#define VMODV4(to,v0,v1) \
|
||||||
|
((to)[0] = SMODS1((v0)[0], (v1)[0]), \
|
||||||
|
(to)[1] = SMODS1((v0)[1], (v1)[1]), \
|
||||||
|
(to)[2] = SMODS1((v0)[2], (v1)[2]), \
|
||||||
|
(to)[3] = SMODS1((v0)[3], (v1)[3]))
|
||||||
|
#define VDIVS4(to,v,s) \
|
||||||
|
((to)[0] = SDIVS1((v)[0], s), \
|
||||||
|
(to)[1] = SDIVS1((v)[1], s), \
|
||||||
|
(to)[2] = SDIVS1((v)[2], s), \
|
||||||
|
(to)[3] = SDIVS1((v)[3], s))
|
||||||
|
#define VDIVV4(to,v0,v1) \
|
||||||
|
((to)[0] = SDIVS1((v0)[0], (v1)[0]), \
|
||||||
|
(to)[1] = SDIVS1((v0)[1], (v1)[1]), \
|
||||||
|
(to)[2] = SDIVS1((v0)[2], (v1)[2]), \
|
||||||
|
(to)[3] = SDIVS1((v0)[3], (v1)[3]))
|
||||||
|
#define VMINS4(to,v,s) \
|
||||||
|
((to)[0] = SMINS1((v)[0], s), \
|
||||||
|
(to)[1] = SMINS1((v)[1], s), \
|
||||||
|
(to)[2] = SMINS1((v)[2], s), \
|
||||||
|
(to)[3] = SMINS1((v)[3], s))
|
||||||
|
#define VMINV4(to,v0,v1) \
|
||||||
|
((to)[0] = SMINS1((v0)[0], (v1)[0]), \
|
||||||
|
(to)[1] = SMINS1((v0)[1], (v1)[1]), \
|
||||||
|
(to)[2] = SMINS1((v0)[2], (v1)[2]), \
|
||||||
|
(to)[3] = SMINS1((v0)[3], (v1)[3]))
|
||||||
|
#define VMAXS4(to,v,s) \
|
||||||
|
((to)[0] = SMAXS1((v)[0], s), \
|
||||||
|
(to)[1] = SMAXS1((v)[1], s), \
|
||||||
|
(to)[2] = SMAXS1((v)[2], s), \
|
||||||
|
(to)[3] = SMAXS1((v)[3], s))
|
||||||
|
#define VMAXV4(to,v0,v1) \
|
||||||
|
((to)[0] = SMAXS1((v0)[0], (v1)[0]), \
|
||||||
|
(to)[1] = SMAXS1((v0)[1], (v1)[1]), \
|
||||||
|
(to)[2] = SMAXS1((v0)[2], (v1)[2]), \
|
||||||
|
(to)[3] = SMAXS1((v0)[3], (v1)[3]))
|
||||||
#define LERP4(to,v0,v1,t) \
|
#define LERP4(to,v0,v1,t) \
|
||||||
((to)[0]=(v0)[0]+(t)*((v1)[0]-(v0)[0]), \
|
((to)[0]=(v0)[0]+(t)*((v1)[0]-(v0)[0]), \
|
||||||
(to)[1]=(v0)[1]+(t)*((v1)[1]-(v0)[1]), \
|
(to)[1]=(v0)[1]+(t)*((v1)[1]-(v0)[1]), \
|
||||||
@ -745,6 +890,16 @@
|
|||||||
#define ADJOINT2i(to,m) ADJOINT2safe(int,to,m)
|
#define ADJOINT2i(to,m) ADJOINT2safe(int,to,m)
|
||||||
#define ADJOINT2l(to,m) ADJOINT2safe(long,to,m)
|
#define ADJOINT2l(to,m) ADJOINT2safe(long,to,m)
|
||||||
#define ADJOINT2r(to,m) ADJOINT2safe(real,to,m)
|
#define ADJOINT2r(to,m) ADJOINT2safe(real,to,m)
|
||||||
|
#define INVERTMAT2safe(type,to,from) \
|
||||||
|
do {type _vec_h_temp_[2][2]; \
|
||||||
|
ADJOINT2(_vec_h_temp_, from); \
|
||||||
|
type _vec_h_temp_invdet_ = (type)1/(type)DET2(from); \
|
||||||
|
SXM2(to, _vec_h_temp_invdet_, _vec_h_temp_); \
|
||||||
|
} while (0)
|
||||||
|
#define INVERTMAT2d(to,from) INVERTMAT2safe(double,to,from)
|
||||||
|
#define INVERTMAT2i(to,from) INVERTMAT2safe(int,to,from)
|
||||||
|
#define INVERTMAT2l(to,from) INVERTMAT2safe(long,to,from)
|
||||||
|
#define INVERTMAT2r(to,from) INVERTMAT2safe(real,to,from)
|
||||||
#define TRANSPOSE3safe(type,to,from) \
|
#define TRANSPOSE3safe(type,to,from) \
|
||||||
do {type _vec_h_temp_[3][3]; \
|
do {type _vec_h_temp_[3][3]; \
|
||||||
TRANSPOSE3(_vec_h_temp_,from); \
|
TRANSPOSE3(_vec_h_temp_,from); \
|
||||||
@ -835,6 +990,16 @@
|
|||||||
#define ADJOINT3i(to,m) ADJOINT3safe(int,to,m)
|
#define ADJOINT3i(to,m) ADJOINT3safe(int,to,m)
|
||||||
#define ADJOINT3l(to,m) ADJOINT3safe(long,to,m)
|
#define ADJOINT3l(to,m) ADJOINT3safe(long,to,m)
|
||||||
#define ADJOINT3r(to,m) ADJOINT3safe(real,to,m)
|
#define ADJOINT3r(to,m) ADJOINT3safe(real,to,m)
|
||||||
|
#define INVERTMAT3safe(type,to,from) \
|
||||||
|
do {type _vec_h_temp_[3][3]; \
|
||||||
|
ADJOINT3(_vec_h_temp_, from); \
|
||||||
|
type _vec_h_temp_invdet_ = (type)1/(type)DET3(from); \
|
||||||
|
SXM3(to, _vec_h_temp_invdet_, _vec_h_temp_); \
|
||||||
|
} while (0)
|
||||||
|
#define INVERTMAT3d(to,from) INVERTMAT3safe(double,to,from)
|
||||||
|
#define INVERTMAT3i(to,from) INVERTMAT3safe(int,to,from)
|
||||||
|
#define INVERTMAT3l(to,from) INVERTMAT3safe(long,to,from)
|
||||||
|
#define INVERTMAT3r(to,from) INVERTMAT3safe(real,to,from)
|
||||||
#define TRANSPOSE4safe(type,to,from) \
|
#define TRANSPOSE4safe(type,to,from) \
|
||||||
do {type _vec_h_temp_[4][4]; \
|
do {type _vec_h_temp_[4][4]; \
|
||||||
TRANSPOSE4(_vec_h_temp_,from); \
|
TRANSPOSE4(_vec_h_temp_,from); \
|
||||||
@ -907,4 +1072,14 @@
|
|||||||
#define ADJOINT4i(to,m) ADJOINT4safe(int,to,m)
|
#define ADJOINT4i(to,m) ADJOINT4safe(int,to,m)
|
||||||
#define ADJOINT4l(to,m) ADJOINT4safe(long,to,m)
|
#define ADJOINT4l(to,m) ADJOINT4safe(long,to,m)
|
||||||
#define ADJOINT4r(to,m) ADJOINT4safe(real,to,m)
|
#define ADJOINT4r(to,m) ADJOINT4safe(real,to,m)
|
||||||
|
#define INVERTMAT4safe(type,to,from) \
|
||||||
|
do {type _vec_h_temp_[4][4]; \
|
||||||
|
ADJOINT4(_vec_h_temp_, from); \
|
||||||
|
type _vec_h_temp_invdet_ = (type)1/(type)DET4(from); \
|
||||||
|
SXM4(to, _vec_h_temp_invdet_, _vec_h_temp_); \
|
||||||
|
} while (0)
|
||||||
|
#define INVERTMAT4d(to,from) INVERTMAT4safe(double,to,from)
|
||||||
|
#define INVERTMAT4i(to,from) INVERTMAT4safe(int,to,from)
|
||||||
|
#define INVERTMAT4l(to,from) INVERTMAT4safe(long,to,from)
|
||||||
|
#define INVERTMAT4r(to,from) INVERTMAT4safe(real,to,from)
|
||||||
#endif /* VEC_H */
|
#endif /* VEC_H */
|
||||||
@ -199,7 +199,8 @@ add_library(lego1 SHARED
|
|||||||
LEGO1/racestate.cpp
|
LEGO1/racestate.cpp
|
||||||
LEGO1/radio.cpp
|
LEGO1/radio.cpp
|
||||||
LEGO1/radiostate.cpp
|
LEGO1/radiostate.cpp
|
||||||
LEGO1/realtimeview.cpp
|
LEGO1/realtime/realtime.cpp
|
||||||
|
LEGO1/realtime/realtimeview.cpp
|
||||||
LEGO1/registrationbook.cpp
|
LEGO1/registrationbook.cpp
|
||||||
LEGO1/score.cpp
|
LEGO1/score.cpp
|
||||||
LEGO1/scorestate.cpp
|
LEGO1/scorestate.cpp
|
||||||
@ -209,6 +210,9 @@ add_library(lego1 SHARED
|
|||||||
LEGO1/viewmanager.cpp
|
LEGO1/viewmanager.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Additional include directories for both targets
|
||||||
|
include_directories("${CMAKE_SOURCE_DIR}/3rdparty/vec")
|
||||||
|
|
||||||
if (ISLE_USE_SMARTHEAP)
|
if (ISLE_USE_SMARTHEAP)
|
||||||
add_library(SmartHeap::SmartHeap STATIC IMPORTED)
|
add_library(SmartHeap::SmartHeap STATIC IMPORTED)
|
||||||
set_target_properties(SmartHeap::SmartHeap PROPERTIES
|
set_target_properties(SmartHeap::SmartHeap PROPERTIES
|
||||||
|
|||||||
@ -33,40 +33,6 @@ ExtraActionType MatchActionString(const char *p_str) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// OFFSET: LEGO1 0x100a5b40
|
|
||||||
void CalcLocalTransform(const MxVector3 &p_posVec, const MxVector3 &p_dirVec,
|
|
||||||
const MxVector3 &p_upVec, MxMatrix &p_outMatrix)
|
|
||||||
{
|
|
||||||
MxFloat x_axis[3], y_axis[3], z_axis[3];
|
|
||||||
|
|
||||||
NORMVEC3(z_axis, p_dirVec)
|
|
||||||
NORMVEC3(y_axis, p_upVec)
|
|
||||||
|
|
||||||
VXV3(x_axis, y_axis, z_axis);
|
|
||||||
|
|
||||||
// This is an unrolled version of the "NORMVEC3" macro,
|
|
||||||
// used here to apply a silly hack to get a 100% match
|
|
||||||
{
|
|
||||||
const MxFloat axis2Operation = (x_axis)[2] * (x_axis)[2];
|
|
||||||
MxDouble len = sqrt(((x_axis)[0] * (x_axis)[0] + axis2Operation + (x_axis)[1] * (x_axis)[1]));
|
|
||||||
((x_axis)[0] = (x_axis)[0] / (len), (x_axis)[1] = (x_axis)[1] / (len), (x_axis)[2] = (x_axis)[2] / (len));
|
|
||||||
}
|
|
||||||
|
|
||||||
VXV3(y_axis, z_axis, x_axis);
|
|
||||||
|
|
||||||
// Exact same thing as pointed out by the above comment
|
|
||||||
{
|
|
||||||
const MxFloat axis2Operation = (y_axis)[2] * (y_axis)[2];
|
|
||||||
MxDouble len = sqrt(((y_axis)[0] * (y_axis)[0] + axis2Operation + (y_axis)[1] * (y_axis)[1]));
|
|
||||||
((y_axis)[0] = (y_axis)[0] / (len), (y_axis)[1] = (y_axis)[1] / (len), (y_axis)[2] = (y_axis)[2] / (len));
|
|
||||||
}
|
|
||||||
|
|
||||||
SET4from3(&p_outMatrix[0], x_axis, 0);
|
|
||||||
SET4from3(&p_outMatrix[4], y_axis, 0);
|
|
||||||
SET4from3(&p_outMatrix[8], z_axis, 0);
|
|
||||||
SET4from3(&p_outMatrix[12], p_posVec, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// OFFSET: LEGO1 0x1003eae0
|
// OFFSET: LEGO1 0x1003eae0
|
||||||
void ConvertHSVToRGB(float h, float s, float v, float *r_out, float *b_out, float *g_out)
|
void ConvertHSVToRGB(float h, float s, float v, float *r_out, float *b_out, float *g_out)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -4,11 +4,6 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#include "extra.h"
|
#include "extra.h"
|
||||||
#include "mxmatrix.h"
|
|
||||||
|
|
||||||
#define NORMVEC3(dst, src) { \
|
|
||||||
MxDouble len = sqrt(NORMSQRD3(src)); \
|
|
||||||
VDS3(dst, src, len); }
|
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
inline T Abs(T p_t)
|
inline T Abs(T p_t)
|
||||||
@ -60,7 +55,5 @@ inline void GetString(char **p_source, const char *&p_dest, T *p_obj, void (T::*
|
|||||||
ExtraActionType MatchActionString(const char *);
|
ExtraActionType MatchActionString(const char *);
|
||||||
void ConvertHSVToRGB(float r, float g, float b, float* out_r, float* out_g, float* out_b);
|
void ConvertHSVToRGB(float r, float g, float b, float* out_r, float* out_g, float* out_b);
|
||||||
void SetAppCursor(WPARAM p_wparam);
|
void SetAppCursor(WPARAM p_wparam);
|
||||||
void CalcLocalTransform(const MxVector3 &p_posVec, const MxVector3 &p_dirVec,
|
|
||||||
const MxVector3 &p_upVec, MxMatrix &p_outMatrix);
|
|
||||||
|
|
||||||
#endif // LEGOUTIL_H
|
#endif // LEGOUTIL_H
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
#define MXVECTOR_H
|
#define MXVECTOR_H
|
||||||
|
|
||||||
#include "mxtypes.h"
|
#include "mxtypes.h"
|
||||||
#include "vec.h"
|
#include <vec.h>
|
||||||
|
|
||||||
// VTABLE 0x100d4288
|
// VTABLE 0x100d4288
|
||||||
// SIZE 0x8
|
// SIZE 0x8
|
||||||
|
|||||||
@ -135,8 +135,8 @@ MxVideoPresenter::AlphaMask::AlphaMask(const MxBitmap &p_bitmap)
|
|||||||
for (MxS32 i = 0; i < m_width; i++) {
|
for (MxS32 i = 0; i < m_width; i++) {
|
||||||
if (*t_ptr) {
|
if (*t_ptr) {
|
||||||
// TODO: Second CDQ instruction for abs() should not be there.
|
// TODO: Second CDQ instruction for abs() should not be there.
|
||||||
MxS32 shift = abs(offset) & 7;
|
MxU32 shift = abs(offset) & 7;
|
||||||
m_bitmask[offset / 8] |= (1 << abs(shift));
|
m_bitmask[offset / 8] |= (1 << abs((MxS32)shift));
|
||||||
}
|
}
|
||||||
t_ptr++;
|
t_ptr++;
|
||||||
offset++;
|
offset++;
|
||||||
|
|||||||
41
LEGO1/realtime/realtime.cpp
Normal file
41
LEGO1/realtime/realtime.cpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#include "realtime.h"
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100a5b40
|
||||||
|
void CalcLocalTransform(const MxVector3 &p_posVec, const MxVector3 &p_dirVec,
|
||||||
|
const MxVector3 &p_upVec, MxMatrix &p_outMatrix)
|
||||||
|
{
|
||||||
|
MxFloat x_axis[3], y_axis[3], z_axis[3];
|
||||||
|
|
||||||
|
// This is an unrolled version of the "NORMVEC3" macro,
|
||||||
|
// used here to apply a silly hack to get a 100% match
|
||||||
|
{
|
||||||
|
const MxFloat dirVec1Operation = (p_dirVec)[1] * (p_dirVec)[1];
|
||||||
|
MxDouble len = sqrt(((p_dirVec)[0] * (p_dirVec)[0] + dirVec1Operation + (p_dirVec)[2] * (p_dirVec)[2]));
|
||||||
|
((z_axis)[0] = (p_dirVec)[0] / (len), (z_axis)[1] = (p_dirVec)[1] / (len), (z_axis)[2] = (p_dirVec)[2] / (len));
|
||||||
|
}
|
||||||
|
|
||||||
|
NORMVEC3(y_axis, p_upVec)
|
||||||
|
|
||||||
|
VXV3(x_axis, y_axis, z_axis);
|
||||||
|
|
||||||
|
// Exact same thing as pointed out by the above comment
|
||||||
|
{
|
||||||
|
const MxFloat axis2Operation = (x_axis)[2] * (x_axis)[2];
|
||||||
|
MxDouble len = sqrt(((x_axis)[0] * (x_axis)[0] + axis2Operation + (x_axis)[1] * (x_axis)[1]));
|
||||||
|
((x_axis)[0] = (x_axis)[0] / (len), (x_axis)[1] = (x_axis)[1] / (len), (x_axis)[2] = (x_axis)[2] / (len));
|
||||||
|
}
|
||||||
|
|
||||||
|
VXV3(y_axis, z_axis, x_axis);
|
||||||
|
|
||||||
|
// Again, the same thing
|
||||||
|
{
|
||||||
|
const MxFloat axis2Operation = (y_axis)[2] * (y_axis)[2];
|
||||||
|
MxDouble len = sqrt(((y_axis)[0] * (y_axis)[0] + axis2Operation + (y_axis)[1] * (y_axis)[1]));
|
||||||
|
((y_axis)[0] = (y_axis)[0] / (len), (y_axis)[1] = (y_axis)[1] / (len), (y_axis)[2] = (y_axis)[2] / (len));
|
||||||
|
}
|
||||||
|
|
||||||
|
SET4from3(&p_outMatrix[0], x_axis, 0);
|
||||||
|
SET4from3(&p_outMatrix[4], y_axis, 0);
|
||||||
|
SET4from3(&p_outMatrix[8], z_axis, 0);
|
||||||
|
SET4from3(&p_outMatrix[12], p_posVec, 1);
|
||||||
|
}
|
||||||
13
LEGO1/realtime/realtime.h
Normal file
13
LEGO1/realtime/realtime.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#ifndef REALTIME_H
|
||||||
|
#define REALTIME_H
|
||||||
|
|
||||||
|
#include "../mxmatrix.h"
|
||||||
|
|
||||||
|
#define NORMVEC3(dst, src) { \
|
||||||
|
MxDouble len = sqrt(NORMSQRD3(src)); \
|
||||||
|
VDS3(dst, src, len); }
|
||||||
|
|
||||||
|
void CalcLocalTransform(const MxVector3 &p_posVec, const MxVector3 &p_dirVec,
|
||||||
|
const MxVector3 &p_upVec, MxMatrix &p_outMatrix);
|
||||||
|
|
||||||
|
#endif // REALTIME_H
|
||||||
Loading…
Reference in New Issue
Block a user