void ell_4m_mul_d(double m3[16], const double _m1[16], const double _m2[16]) { double m1[16], m2[16]; ELL_4M_COPY(m1, _m1); ELL_4M_COPY(m2, _m2); ELL_4M_MUL(m3, m1, m2); }
void ell_4m_mul_f(float m3[16], const float _m1[16], const float _m2[16]) { float m1[16], m2[16]; ELL_4M_COPY(m1, _m1); ELL_4M_COPY(m2, _m2); ELL_4M_MUL(m3, m1, m2); }
void ell_4m_post_mul_d(double _m[16], const double x[16]) { double m[16]; ELL_4M_MUL(m, x, _m); ELL_4M_COPY(_m, m); }
void ell_4m_post_mul_f(float _m[16], const float x[16]) { float m[16]; ELL_4M_MUL(m, x, _m); ELL_4M_COPY(_m, m); }
void ell_4m_pre_mMul_d(double _m[16], const double x[16]) { double m[16]; ELL_4M_MUL(m, _m, x); ELL_4M_COPY(_m, m); }
/* ******** limnCameraUpdate() ** ** sets in cam: W2V, V2W, U, V, N, vspNeer, vspFaar, vspDist ** and, if fov and aspect are set, this also sets uRange and vRange ** ** This does use biff to describe problems with camera settings */ int limnCameraUpdate(limnCamera *cam) { static const char me[] = "limnCameraUpdate"; double len, bb[4], uu[4], vv[4], nn[4], TT[16], RR[16]; if (!cam) { biffAddf(LIMN, "%s: got NULL pointer", me); return 1; } ELL_4V_SET(uu, 0, 0, 0, 0); ELL_4V_SET(vv, 0, 0, 0, 0); ELL_4V_SET(nn, 0, 0, 0, 0); ELL_4V_SET(bb, 0, 0, 0, 1); ELL_3V_SUB(nn, cam->at, cam->from); len = ELL_3V_LEN(nn); if (!len) { biffAddf(LIMN, "%s: cam->at (%g,%g,%g) == cam->from", me, cam->at[0], cam->at[1], cam->at[2]); return 1; } if (cam->atRelative) { /* ctx->cam->{neer,dist} are "at" relative */ cam->vspNeer = cam->neer + len; cam->vspFaar = cam->faar + len; cam->vspDist = cam->dist + len; } else { /* ctx->cam->{neer,dist} are eye relative */ cam->vspNeer = cam->neer; cam->vspFaar = cam->faar; cam->vspDist = cam->dist; } if (!(cam->vspNeer > 0 && cam->vspDist > 0 && cam->vspFaar > 0)) { biffAddf(LIMN, "%s: eye-relative near (%g), dist (%g), or far (%g) <= 0", me, cam->vspNeer, cam->vspDist, cam->vspFaar); return 1; } if (!(cam->vspNeer <= cam->vspFaar)) { biffAddf(LIMN, "%s: eye-relative near (%g) further than far (%g)", me, cam->vspNeer, cam->vspFaar); return 1 ; } if (AIR_EXISTS(cam->fov)) { if (!( AIR_IN_OP(0.0, cam->fov, 180.0) )) { biffAddf(LIMN, "%s: cam->fov (%g) not in valid range between 0 and 180", me, cam->fov); return 1 ; } if (!AIR_EXISTS(cam->aspect)) { biffAddf(LIMN, "%s: cam->fov set, but cam->aspect isn't", me); return 1; } /* "fov" is half vertical angle */ cam->vRange[0] = -tan(cam->fov*AIR_PI/360)*(cam->vspDist); cam->vRange[1] = -cam->vRange[0]; cam->uRange[0] = cam->vRange[0]*(cam->aspect); cam->uRange[1] = -cam->uRange[0]; } /* else cam->fov isn't set, but we're not going to complain if uRange and vRange aren't both set ... */ ELL_3V_SCALE(nn, 1.0/len, nn); ELL_3V_CROSS(uu, nn, cam->up); len = ELL_3V_LEN(uu); if (!len) { biffAddf(LIMN, "%s: cam->up is co-linear with view direction", me); return 1 ; } ELL_3V_SCALE(uu, 1.0/len, uu); if (cam->rightHanded) { ELL_3V_CROSS(vv, nn, uu); } else { ELL_3V_CROSS(vv, uu, nn); } ELL_4V_COPY(cam->U, uu); ELL_4V_COPY(cam->V, vv); ELL_4V_COPY(cam->N, nn); ELL_4M_TRANSLATE_SET(TT, -cam->from[0], -cam->from[1], -cam->from[2]); ELL_4M_ROWS_SET(RR, uu, vv, nn, bb); ELL_4M_MUL(cam->W2V, RR, TT); ell_4m_inv_d(cam->V2W, cam->W2V); return 0; }
void makeSceneInstance(limnCamera *cam, echoRTParm *parm, echoScene *scene) { echoObject *trim, *rect, *inst; echoPos_t matx[16], A[16], B[16]; ELL_3V_SET(cam->from, 9*1.3, 9*1.3, 11*1.3); ELL_3V_SET(cam->at, 0, 0, 0); ELL_3V_SET(cam->up, 0, 0, 1); cam->uRange[0] = -5; cam->uRange[1] = 5; cam->vRange[0] = -5; cam->vRange[1] = 5; parm->jitterType = echoJitterNone; parm->numSamples = 1; parm->imgResU = 300; parm->imgResV = 300; parm->aperture = 0.0; parm->renderLights = AIR_TRUE; parm->renderBoxes = AIR_FALSE; parm->seedRand = AIR_FALSE; parm->maxRecDepth = 10; parm->shadow = 1.0; ELL_4M_IDENTITY_SET(matx); ELL_4M_SCALE_SET(B, 2.5, 1.5, 0.8); ELL_4M_MUL(A, B, matx); ELL_4M_COPY(matx, A); ELL_4M_ROTATE_X_SET(B, 0.2); ELL_4M_MUL(A, B, matx); ELL_4M_COPY(matx, A); ELL_4M_ROTATE_Y_SET(B, 0.2); ELL_4M_MUL(A, B, matx); ELL_4M_COPY(matx, A); ELL_4M_ROTATE_Y_SET(B, 0.2); ELL_4M_MUL(A, B, matx); ELL_4M_COPY(matx, A); ELL_4M_TRANSLATE_SET(B, 0, 0, 1); ELL_4M_MUL(A, B, matx); ELL_4M_COPY(matx, A); /* trim = echoRoughSphere(50, 25, matx); */ /* trim = echoRoughSphere(8, 4, matx); echoMatterGlassSet(trim, 0.8, 0.8, 0.8, 1.3, 0.0, 0.0); echoMatterPhongSet(trim, 1, 1, 1, 1.0, 0.1, 0.5, 0.9, 50); echoObjectAdd(scene, trim); */ trim = echoObjectNew(scene, echoTypeSphere); echoSphereSet(trim, 0, 0, 0, 1); echoColorSet(trim, 0.8, 0.8, 0.8, 1.0); echoMatterGlassSet(scene, trim, 1.3, 0.0, 0.0, 0.0); echoMatterPhongSet(scene, trim, 0.1, 0.5, 0.9, 50); inst = echoObjectNew(scene, echoTypeInstance); echoInstanceSet(inst, matx, trim); echoObjectAdd(scene, inst); rect = echoObjectNew(scene, echoTypeRectangle); echoRectangleSet(rect, -3.5, -3.5, -3.5, 7, 0, 0, 0, 7, 0); echoColorSet(trim, 1.0, 1.0, 1.0, 1.0); echoMatterPhongSet(scene, rect, 0.1, 0.5, 0.9, 50); echoObjectAdd(scene, rect); rect = echoObjectNew(scene, echoTypeRectangle); echoRectangleSet(rect, -3.5, -3.5, -3.5, 0, 7, 0, 0, 0, 7); echoColorSet(rect, 1.0, 1.0, 1.0, 1.0); echoMatterPhongSet(scene, rect, 0.1, 0.5, 0.9, 50); echoObjectAdd(scene, rect); /* rect = echoObjectNew(scene, echoTypeRectangle); echoRectangleSet(rect, -3.5, -3.5, -3.5, 0, 0, 7, 7, 0, 0); */ rect = echoObjectNew(scene, echoTypeSphere); echoSphereSet(rect, 0, 0, 0, 1); echoColorSet(rect, 1.0, 1.0, 1.0, 1.0); echoMatterPhongSet(scene, rect, 0.1, 0.5, 0.9, 50); inst = echoObjectNew(scene, echoTypeInstance); ELL_4M_SCALE_SET(A, 20, 20, 20); ELL_4M_TRANSLATE_SET(B, 0, -(20+3.5), 0); ELL_4M_MUL(matx, B, A); echoInstanceSet(inst, matx, rect); echoObjectAdd(scene, inst); /* light = echoLightNew(echoLightDirectional); echoLightDirectionalSet(light, 1, 0, 0, 1, 0.001, 0.001); echoLightArrayAdd(lightArr, light); light = echoLightNew(echoLightDirectional); echoLightDirectionalSet(light, 0, 1, 0, 0.001, 1, 0.001); echoLightArrayAdd(lightArr, light); light = echoLightNew(echoLightDirectional); echoLightDirectionalSet(light, 0, 0, 1, 0.001, 0.001, 1); echoLightArrayAdd(lightArr, light); */ return; }