pack_bbox.h revision e0e0c19eefceaf5d4ec40f9466b58a771f50e799
/* Copyright (c) 2001, Stanford University
* All rights reserved.
*
* See the file LICENSE.txt for information on redistributing this software.
*/
#ifndef CR_PACK_BBOX_H
#define CR_PACK_BBOX_H
#include "cr_pack.h"
#define UPDATE_1D_BBOX() \
if (pc->bounds_min.x > fx) pc->bounds_min.x = fx;\
if (pc->bounds_min.y > 0.0f) pc->bounds_min.y = 0.0f;\
if (pc->bounds_min.z > 0.0f) pc->bounds_min.z = 0.0f;\
if (pc->bounds_max.x < fx) pc->bounds_max.x = fx;\
if (pc->bounds_max.y < 0.0f) pc->bounds_max.y = 0.0f;\
if (pc->bounds_max.z < 0.0f) pc->bounds_max.z = 0.0f
#define UPDATE_2D_BBOX() \
if (pc->bounds_min.x > fx) pc->bounds_min.x = fx;\
if (pc->bounds_min.y > fy) pc->bounds_min.y = fy;\
if (pc->bounds_min.z > 0.0f) pc->bounds_min.z = 0.0f;\
if (pc->bounds_max.x < fx) pc->bounds_max.x = fx;\
if (pc->bounds_max.y < fy) pc->bounds_max.y = fy;\
if (pc->bounds_max.z < 0.0f) pc->bounds_max.z = 0.0f
#define UPDATE_3D_BBOX() \
if (pc->bounds_min.x > fx) pc->bounds_min.x = fx; \
if (pc->bounds_min.y > fy) pc->bounds_min.y = fy; \
if (pc->bounds_min.z > fz) pc->bounds_min.z = fz; \
if (pc->bounds_max.x < fx) pc->bounds_max.x = fx; \
if (pc->bounds_max.y < fy) pc->bounds_max.y = fy; \
if (pc->bounds_max.z < fz) pc->bounds_max.z = fz
#ifdef SIMD
#define UPDATE_3D_BBOX_SIMD() \
__asm {\
__asm movups xmm0, fx\
__asm movaps xmm1, pc->bounds_min.x\
__asm movaps xmm2, pc->bounds_max.x\
__asm minps xmm1, xmm0\
__asm maxps xmm2, xmm0\
__asm movaps pc->bounds_min.x, xmm1\
__asm movaps pc->bounds_max.x, xmm2\
}
#define UPDATE_3D_BBOX_SIMD_PACK() \
__asm {\
__asm mov ecx, [data_ptr]\
__asm movups xmm0, fx\
__asm movaps xmm1, pc->bounds_min.x\
__asm movaps xmm2, pc->bounds_max.x\
__asm minps xmm1, xmm0\
__asm maxps xmm2, xmm0\
__asm movaps pc->bounds_min.x, xmm1\
__asm movaps pc->bounds_max.x, xmm2\
__asm movups [ecx], xmm0\
}
#define UPDATE_3DV_BBOX_SIMD() \
__asm {\
__asm mov eax, [v]\
__asm mov ecx, [data_ptr]\
__asm movups xmm0, [eax]\
__asm movaps xmm1, pc->bounds_min.x\
__asm movaps xmm2, pc->bounds_max.x\
__asm minps xmm1, xmm0\
__asm maxps xmm2, xmm0\
__asm movaps pc->bounds_min.x, xmm1\
__asm movaps pc->bounds_max.x, xmm2\
__asm movups [ecx], xmm0\
}
#else
#define UPDATE_3DV_BBOX_SIMD() { CREATE_3D_VFLOATS(); UPDATE_3D_BBOX();}
#define UPDATE_3D_BBOX_SIMD() UPDATE_3D_BBOX()
#endif
#define CREATE_1D_FLOATS() \
GLfloat fx = (GLfloat) x;
#define CREATE_2D_FLOATS() \
GLfloat fx = (GLfloat) x; \
GLfloat fy = (GLfloat) y
#define CREATE_3D_FLOATS() \
GLfloat fx = (GLfloat) x; \
GLfloat fy = (GLfloat) y; \
GLfloat fz = (GLfloat) z
#define CREATE_4D_FLOATS() \
GLfloat fx = (GLfloat) x; \
GLfloat fy = (GLfloat) y; \
GLfloat fz = (GLfloat) z; \
GLfloat fw = (GLfloat) w; \
fx /= fw; fy /= fw; fz/= fw
/* For glVertexAttrib4N*ARB */
#define CREATE_3D_FLOATS_B_NORMALIZED() \
GLfloat fx = (GLfloat) x * (1.0 / 128.0); \
GLfloat fy = (GLfloat) y * (1.0 / 128.0); \
GLfloat fz = (GLfloat) z * (1.0 / 128.0);
#define CREATE_3D_FLOATS_UB_NORMALIZED() \
GLfloat fx = (GLfloat) x * (1.0 / 255.0); \
GLfloat fy = (GLfloat) y * (1.0 / 255.0); \
GLfloat fz = (GLfloat) z * (1.0 / 255.0);
#define CREATE_3D_FLOATS_US_NORMALIZED() \
GLfloat fx = (GLfloat) x * (1.0 / 65535.0); \
GLfloat fy = (GLfloat) y * (1.0 / 65535.0); \
GLfloat fz = (GLfloat) z * (1.0 / 65535.0);
#define CREATE_1D_VFLOATS() \
GLfloat fx = (GLfloat) v[0];
#define CREATE_2D_VFLOATS() \
GLfloat fx = (GLfloat) v[0]; \
GLfloat fy = (GLfloat) v[1]
#define CREATE_3D_VFLOATS() \
GLfloat fx = (GLfloat) v[0]; \
GLfloat fy = (GLfloat) v[1]; \
GLfloat fz = (GLfloat) v[2]
#define CREATE_4D_VFLOATS() \
GLfloat fx = (GLfloat) v[0]; \
GLfloat fy = (GLfloat) v[1]; \
GLfloat fz = (GLfloat) v[2]; \
GLfloat fw = (GLfloat) v[3]; \
fx /= fw; fy /= fw; fz/= fw
/* For glVertexAttrib4N*ARB */
#define CREATE_4D_FLOATS_UB_NORMALIZED() \
GLfloat fx = (GLfloat) (x * (1.0 / 255.0)); \
GLfloat fy = (GLfloat) (y * (1.0 / 255.0)); \
GLfloat fz = (GLfloat) (z * (1.0 / 255.0)); \
GLfloat fw = (GLfloat) (w * (1.0 / 255.0)); \
fx /= fw; fy /= fw; fz/= fw
#define CREATE_4D_VFLOATS_B_NORMALIZED() \
GLfloat fx = (GLfloat) (v[0] * (1.0 / 128.0)); \
GLfloat fy = (GLfloat) (v[1] * (1.0 / 128.0)); \
GLfloat fz = (GLfloat) (v[2] * (1.0 / 128.0)); \
GLfloat fw = (GLfloat) (v[3] * (1.0 / 128.0)); \
fx /= fw; fy /= fw; fz/= fw
#define CREATE_4D_VFLOATS_S_NORMALIZED() \
GLfloat fx = (GLfloat) (2.0 * v[0] + 1.0) / ((GLfloat) (0xffff)); \
GLfloat fy = (GLfloat) (2.0 * v[1] + 1.0) / ((GLfloat) (0xffff)); \
GLfloat fz = (GLfloat) (2.0 * v[2] + 1.0) / ((GLfloat) (0xffff)); \
GLfloat fw = (GLfloat) (2.0 * v[3] + 1.0) / ((GLfloat) (0xffff)); \
fx /= fw; fy /= fw; fz/= fw
#define CREATE_4D_VFLOATS_I_NORMALIZED() \
GLfloat fx = (GLfloat) (2.0 * v[0] + 1.0) / ((GLfloat) (0xffffffff)); \
GLfloat fy = (GLfloat) (2.0 * v[1] + 1.0) / ((GLfloat) (0xffffffff)); \
GLfloat fz = (GLfloat) (2.0 * v[2] + 1.0) / ((GLfloat) (0xffffffff)); \
GLfloat fw = (GLfloat) (2.0 * v[3] + 1.0) / ((GLfloat) (0xffffffff)); \
fx /= fw; fy /= fw; fz/= fw
#define CREATE_4D_VFLOATS_UB_NORMALIZED() \
GLfloat fx = (GLfloat) (v[0] * (1.0 / 255.0)); \
GLfloat fy = (GLfloat) (v[1] * (1.0 / 255.0)); \
GLfloat fz = (GLfloat) (v[2] * (1.0 / 255.0)); \
GLfloat fw = (GLfloat) (v[3] * (1.0 / 255.0)); \
fx /= fw; fy /= fw; fz/= fw
#define CREATE_4D_VFLOATS_US_NORMALIZED() \
GLfloat fx = (GLfloat) (v[0] * (1.0 / 65535.0)); \
GLfloat fy = (GLfloat) (v[1] * (1.0 / 65535.0)); \
GLfloat fz = (GLfloat) (v[2] * (1.0 / 65535.0)); \
GLfloat fw = (GLfloat) (v[3] * (1.0 / 65535.0)); \
fx /= fw; fy /= fw; fz/= fw
#define CREATE_4D_VFLOATS_UI_NORMALIZED() \
GLfloat fx = v[0] / ((GLfloat) (0xffffffff)); \
GLfloat fy = v[1] / ((GLfloat) (0xffffffff)); \
GLfloat fz = v[2] / ((GLfloat) (0xffffffff)); \
GLfloat fw = v[3] / ((GLfloat) (0xffffffff)); \
fx /= fw; fy /= fw; fz/= fw
#endif /* CR_PACK_BBOX_H */