Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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);
}
Exemplo n.º 5
0
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);
}
Exemplo n.º 6
0
Arquivo: cam.c Projeto: BRAINSia/teem
/*
******** 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;
}
Exemplo n.º 7
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;
}