int _echoRayIntx_CubeSolid(echoPos_t *tminP, echoPos_t *tmaxP, echoPos_t xmin, echoPos_t xmax, echoPos_t ymin, echoPos_t ymax, echoPos_t zmin, echoPos_t zmax, echoRay *ray) { echoPos_t txmin, tymin, tzmin, txmax, tymax, tzmax, dx, dy, dz, ox, oy, oz, tmin, tmax; ELL_3V_GET(dx, dy, dz, ray->dir); ELL_3V_GET(ox, oy, oz, ray->from); if (dx >= 0) { txmin = (xmin - ox)/dx; txmax = (xmax - ox)/dx; } else { txmin = (xmax - ox)/dx; txmax = (xmin - ox)/dx; } if (dy >= 0) { tymin = (ymin - oy)/dy; tymax = (ymax - oy)/dy; } else { tymin = (ymax - oy)/dy; tymax = (ymin - oy)/dy; } if (dz >= 0) { tzmin = (zmin - oz)/dz; tzmax = (zmax - oz)/dz; } else { tzmin = (zmax - oz)/dz; tzmax = (zmin - oz)/dz; } if (txmin > tymin) tmin = txmin; else tmin = tymin; if (tzmin > tmin) tmin = tzmin; if (txmax < tymax) tmax = txmax; else tmax = tymax; if (tzmax < tmax) tmax = tzmax; if (tmin >= tmax) return AIR_FALSE; if ( ray->faar < tmin || ray->neer > tmax ) return AIR_FALSE; *tminP = AIR_MAX(tmin, ray->neer); *tmaxP = AIR_MIN(tmax, ray->faar); return AIR_TRUE; }
void _echoRayIntxUV_Cube(echoIntx *intx) { echoPos_t x, y, z; ELL_3V_GET(x, y, z, intx->pos); switch(intx->face) { case 0: intx->u = AIR_AFFINE(-1, y, 1, 0.0, 1.0); intx->v = AIR_AFFINE(-1, -z, 1, 0.0, 1.0); break; case 1: intx->u = AIR_AFFINE(-1, -x, 1, 0.0, 1.0); intx->v = AIR_AFFINE(-1, -z, 1, 0.0, 1.0); break; case 2: intx->u = AIR_AFFINE(-1, -x, 1, 0.0, 1.0); intx->v = AIR_AFFINE(-1, y, 1, 0.0, 1.0); break; case 3: intx->u = AIR_AFFINE(-1, -y, 1, 0.0, 1.0); intx->v = AIR_AFFINE(-1, z, 1, 0.0, 1.0); break; case 4: intx->u = AIR_AFFINE(-1, x, 1, 0.0, 1.0); intx->v = AIR_AFFINE(-1, z, 1, 0.0, 1.0); break; case 5: intx->u = AIR_AFFINE(-1, x, 1, 0.0, 1.0); intx->v = AIR_AFFINE(-1, -y, 1, 0.0, 1.0); break; } }
void dyeXYZtoRGB(float *R, float *G, float *B, float X, float Y, float Z) { float in[3], out[3]; ELL_3V_SET(in, X, Y, Z); ELL_3MV_MUL(out, dyeXYZtoRGBMatx, in); ELL_3V_GET(*R, *G, *B, out); return; }
void dyeRGBtoXYZ(float *X, float *Y, float *Z, float R, float G, float B) { float in[3], out[3]; ELL_3V_SET(in, R, G, B); ELL_3MV_MUL(out, dyeRGBtoXYZMatx, in); ELL_3V_GET(*X, *Y, *Z, out); return; }
int dyeColorGet(float *v0P, float *v1P, float *v2P, dyeColor *col) { int spc; spc = dyeSpaceUnknown; if (v0P && v1P && v2P && col) { col->ii = AIR_CLAMP(0, col->ii, 1); spc = col->spc[col->ii]; ELL_3V_GET(*v0P, *v1P, *v2P, col->val[col->ii]); } return spc; }
void cb(float rgb[3], float vec[3], void *blah) { float r, g, b; AIR_UNUSED(blah); ELL_3V_GET(r, g, b, vec); r = AIR_MAX(0, r); g = AIR_MAX(0, g); b = AIR_MAX(0, b); ELL_3V_SET(rgb, r, g, b); return; }
int _echoRayIntx_CubeSurf(echoPos_t *tP, int *axP, int *dirP, echoPos_t xmin, echoPos_t xmax, echoPos_t ymin, echoPos_t ymax, echoPos_t zmin, echoPos_t zmax, echoRay *ray) { echoPos_t txmin, tymin, tzmin, txmax, tymax, tzmax, dx, dy, dz, ox, oy, oz, tmin, tmax; int axmin, axmax, sgn[3]; ELL_3V_GET(dx, dy, dz, ray->dir); ELL_3V_GET(ox, oy, oz, ray->from); if (dx >= 0) { txmin = (xmin - ox)/dx; txmax = (xmax - ox)/dx; sgn[0] = -1; } else { txmin = (xmax - ox)/dx; txmax = (xmin - ox)/dx; sgn[0] = 1; } if (dy >= 0) { tymin = (ymin - oy)/dy; tymax = (ymax - oy)/dy; sgn[1] = -1; } else { tymin = (ymax - oy)/dy; tymax = (ymin - oy)/dy; sgn[1] = 1; } if (dz >= 0) { tzmin = (zmin - oz)/dz; tzmax = (zmax - oz)/dz; sgn[2] = -1; } else { tzmin = (zmax - oz)/dz; tzmax = (zmin - oz)/dz; sgn[2] = 1; } if (txmin > tymin) { tmin = txmin; axmin = 0; } else { tmin = tymin; axmin = 1; } if (tzmin > tmin) { tmin = tzmin; axmin = 2; } if (txmax < tymax) { tmax = txmax; axmax = 0; } else { tmax = tymax; axmax = 1; } if (tzmax < tmax) { tmax = tzmax; axmax = 2; } if (tmin >= tmax) return AIR_FALSE; *tP = tmin; *axP = axmin; *dirP = sgn[axmin]; if (!AIR_IN_CL(ray->neer, tmin, ray->faar)) { *tP = tmax; *axP = axmax; *dirP = -sgn[axmax]; if (!AIR_IN_CL(ray->neer, tmax, ray->faar)) { return AIR_FALSE; } } return AIR_TRUE; }
void _ell_3m_evecs_d(double evec[9], double eval[3], int roots, const double m[9]) { double n[9], e0=0, e1=0.0, e2=0.0, t /* , tmpv[3] */ ; ELL_3V_GET(e0, e1, e2, eval); /* if (ell_debug) { printf("ell_3m_evecs_d: numroots = %d\n", numroots); } */ /* we form m - lambda*I by doing a memcpy from m, and then (repeatedly) over-writing the diagonal elements */ ELL_3M_COPY(n, m); switch (roots) { case ell_cubic_root_three: /* if (ell_debug) { printf("ell_3m_evecs_d: evals: %20.15f %20.15f %20.15f\n", eval[0], eval[1], eval[2]); } */ ELL_3M_DIAG_SET(n, m[0]-e0, m[4]-e0, m[8]-e0); ell_3m_1d_nullspace_d(evec+0, n); ELL_3M_DIAG_SET(n, m[0]-e1, m[4]-e1, m[8]-e1); ell_3m_1d_nullspace_d(evec+3, n); ELL_3M_DIAG_SET(n, m[0]-e2, m[4]-e2, m[8]-e2); ell_3m_1d_nullspace_d(evec+6, n); _ell_3m_enforce_orthogonality(evec); _ell_3m_make_right_handed_d(evec); ELL_3V_SET(eval, e0, e1, e2); break; case ell_cubic_root_single_double: ELL_SORT3(e0, e1, e2, t); if (e0 > e1) { /* one big (e0) , two small (e1, e2) : more like a cigar */ ELL_3M_DIAG_SET(n, m[0]-e0, m[4]-e0, m[8]-e0); ell_3m_1d_nullspace_d(evec+0, n); ELL_3M_DIAG_SET(n, m[0]-e1, m[4]-e1, m[8]-e1); ell_3m_2d_nullspace_d(evec+3, evec+6, n); } else { /* two big (e0, e1), one small (e2): more like a pancake */ ELL_3M_DIAG_SET(n, m[0]-e0, m[4]-e0, m[8]-e0); ell_3m_2d_nullspace_d(evec+0, evec+3, n); ELL_3M_DIAG_SET(n, m[0]-e2, m[4]-e2, m[8]-e2); ell_3m_1d_nullspace_d(evec+6, n); } _ell_3m_enforce_orthogonality(evec); _ell_3m_make_right_handed_d(evec); ELL_3V_SET(eval, e0, e1, e2); break; case ell_cubic_root_triple: /* one triple root; use any basis as the eigenvectors */ ELL_3V_SET(evec+0, 1, 0, 0); ELL_3V_SET(evec+3, 0, 1, 0); ELL_3V_SET(evec+6, 0, 0, 1); ELL_3V_SET(eval, e0, e1, e2); break; case ell_cubic_root_single: /* only one real root */ ELL_3M_DIAG_SET(n, m[0]-e0, m[4]-e0, m[8]-e0); ell_3m_1d_nullspace_d(evec+0, n); ELL_3V_SET(evec+3, AIR_NAN, AIR_NAN, AIR_NAN); ELL_3V_SET(evec+6, AIR_NAN, AIR_NAN, AIR_NAN); ELL_3V_SET(eval, e0, AIR_NAN, AIR_NAN); break; } /* if (ell_debug) { printf("ell_3m_evecs_d (numroots = %d): evecs: \n", numroots); ELL_3MV_MUL(tmpv, m, evec[0]); printf(" (%g:%g): %20.15f %20.15f %20.15f\n", eval[0], ELL_3V_DOT(evec[0], tmpv), evec[0][0], evec[0][1], evec[0][2]); ELL_3MV_MUL(tmpv, m, evec[1]); printf(" (%g:%g): %20.15f %20.15f %20.15f\n", eval[1], ELL_3V_DOT(evec[1], tmpv), evec[1][0], evec[1][1], evec[1][2]); ELL_3MV_MUL(tmpv, m, evec[2]); printf(" (%g:%g): %20.15f %20.15f %20.15f\n", eval[2], ELL_3V_DOT(evec[2], tmpv), evec[2][0], evec[2][1], evec[2][2]); } */ return; }