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