vec3 traceray(const vec3 &origin, const vec3 &dir, int depth) { if (depth == 0) return vec3(); vec3 fcolor = bgcolor; int obj; float t; if ((obj = intersect(origin, dir, t)) != -1) { fcolor = ambient.mult(myobj_mat[obj].color); int light_size = sizeof(light_pos) / sizeof(vec3); int obj_size = sizeof(mysph_pos) / sizeof(vec3); vec3 pos = origin + (dir * t); for (int i = 0; i < light_size; i++) { vec3 lightray = normalize(light_pos[i] - pos); float temp; if (intersect(pos, lightray, temp) == -1) { if (myobj_mat[obj].kd > 0) { vec3 nor = normalize(pos - mysph_pos[obj]); fcolor = fcolor + ((light_color[i] * (nor.dot(lightray)) * myobj_mat[obj].kd).mult(myobj_mat[obj].color)); } if (myobj_mat[obj].ks > 0) { vec3 refDir = mirrorDir(pos, lightray, obj) * (-1); fcolor = fcolor + ((light_color[i] * (dir.dot(refDir)) * myobj_mat[obj].ks).mult(myobj_mat[obj].color)); } } if(myobj_mat[obj].kr > 0) fcolor = fcolor + ((traceray(pos, mirrorDir(pos, dir, obj), depth - 1) * myobj_mat[obj].kr).mult(myobj_mat[obj].color)); } } // note that, before returning the color, the computed color may be rounded to [0.0, 1.0]. fcolor = clamp(fcolor); return fcolor; }
} vec3 dappy::math::operator*(vec3 ref, const vec3 & def) { return ref.mult(def);