Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] View of /branches/charisee_dev/Notes/compile/mode/mode-vr.diderot
ViewVC logotype

View of /branches/charisee_dev/Notes/compile/mode/mode-vr.diderot

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3395 - (download) (annotate)
Tue Nov 10 18:23:07 2015 UTC (4 years, 10 months ago) by cchiw
File size: 2904 byte(s)
val-num in evalkrn
input real isoval = 1;
input real thick = 0.8;



field#2(3)[3,3] V = bspln3 ⊛ image("../../data/dpl-cropsm-ten9.nrrd");
field#2(3)[3,3] E = V - trace(V)*identity[3]/3;
field#2(3)[] F = 3*sqrt(6)*det(E/|E|);

field#0(1)[3] cmap = tent ⊛ image("../../data/diverg-cmap.nrrd");
function vec3 color(vec3 x) = cmap(clamp(-1,1,F(x)/2));

input real refStep = 1;
input real keps = 0.0001;

input vec3 camEye = [245.13, -233.772, 280.148];
input vec3 camAt = [50, 50, 18.6];
input vec3 camUp = [0, 0, 1];
input real camNearAtRel = -49.0;
input real camFarAtRel = 53.0;
input real camFOV = 8.5;
input int iresU = 755;
input int iresV = 500;
input real phongKa = 0.3;
input real phongKd = 0.7;
input real rayStep = 0.4;
input vec3 lightVsp = [-2.0, -3.5, -4.0];

input int which = 0;
input real strn = -∞;

// (boilerplate) computation of camera and light info
real camDist = |camAt - camEye|;
real camNear = camNearAtRel + camDist;
real camFar = camFarAtRel + camDist;
vec3 camN = normalize(camAt - camEye);  // away from eye
vec3 camU = normalize(camN × camUp);    // right
vec3 camV = camN × camU;                // down
real camVmax = tan(camFOV*π/360)*camDist;
real camUmax = camVmax*iresU/iresV;
vec3 light = transpose([camU,camV,camN])•normalize(lightVsp);

function real alpha(real v, real g) = max(0, 1 - |v/g|/thick);

strand raycast(int ui, int vi) {
  real rayU = lerp(-camUmax, camUmax, -0.5, ui, iresU-0.5);
  real rayV = lerp(-camVmax, camVmax, -0.5, vi, iresV-0.5);
  real rayN = camNear;
  vec3 rayVec = (camDist*camN + rayU*camU + rayV*camV)/camDist;
  real transp = 1;
  vec3 rgb = [0, 0, 0];
  output vec4 rgba = [0, 0, 0, 0];

  update {
    vec3 x = camEye + rayN*rayVec;
    if (inside(x,V)) {
      vec3 grad = -∇F(x);
      real a = 0;
      if (0 == which) {
        real val = F(x);
        a = alpha(val-isoval, |grad|);
        a = max(a, alpha(val+isoval, |grad|));
      } else {
        tensor[3,3] hess = ∇⊗∇F(x);
        vec3{3} evec = evecs(hess);
        real{3} eval = evals(hess);
        if (eval{1} < 0 && |grad|/eval{1} > strn) {
          vec3 off = (evec{2}⊗evec{2}/eval{2} + evec{1}⊗evec{1}/eval{1})•grad;
          a = alpha(|off|, 1);
          grad = -(evec{2}⊗evec{2} + evec{1}⊗evec{1})•grad;
        }
      }
      if (a > 0) {
        a = 1 - pow(1-a, rayStep*|rayVec|/refStep);
        real depth = lerp(1.1, 0.8, camNear, rayN, camFar);
        real shade = |normalize(grad)•light|;
        rgb += transp*a*depth*(phongKa + phongKd*shade)*color(x);
        transp *= 1 - a;
      }
    }
    if (transp < 0.01) {  // early ray termination
      transp = 0;
      stabilize;
    }
    if (rayN > camFar) {
      stabilize;
    }
    rayN = rayN + rayStep;
  }
  stabilize {
    real a = 1-transp;
    if (a > 0) rgba = [rgb[0]/a, rgb[1]/a, rgb[2]/a, a];
  }
}
initially [ raycast(ui, vi) | vi in 0..iresV-1, ui in 0..iresU-1 ];

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0