void hotcold_gradient_lerp(float pucker_sum, float *rgb) { vec_zero(rgb); // set default color to black // hot to cold color map // Red (1, 0, 0) -> Yellow (1, 1, 0) -> Green (0, 1, 0) -> Cyan (0, 1, 1) -> blue (0, 0, 1) float red[3] = {1.0f, 0.0f, 0.0f}; float yellow[3] = {1.0f, 1.0f, 0.0f}; float yellow2[3] = {0.8f, 1.0f, 0.0f}; float green[3] = {0.0f, 1.0f, 0.0f}; float green2[3] = {0.6f, 1.0f, 0.0f}; float cyan[3] = {0.0f, 1.0f, 1.0f}; float cyan2[3] = {0.0f, 1.0f, 0.8f}; float blue[3] = {0.0f, 0.0f, 1.0f}; if (pucker_sum < 0.25f) { lerp_color_range(rgb, pucker_sum, 0.00f, 0.25f, red, yellow); } else if (pucker_sum < 0.45f) { vec_copy(rgb, yellow); } else if (pucker_sum < 0.55f) { lerp_color_range(rgb, pucker_sum, 0.45f, 0.55f, yellow, green2); } else if (pucker_sum < 0.75f) { lerp_color_range(rgb, pucker_sum, 0.55f, 0.75f, green, cyan2); } else { lerp_color_range(rgb, pucker_sum, 0.75f, 1.00f, cyan, blue); } clamp_color(rgb); // clamp color values to legal range }
void hotcold_gradient(float pucker_sum, float *rgb) { vec_zero(rgb); // set default color to black // hot to cold color map // Red (1, 0, 0) -> Yellow (1, 1, 0) -> Green (0, 1, 0) -> Cyan (0, 1, 1) -> blue (0, 0, 1) -> magenta (1, 0, 1) if (pucker_sum < 0.40f) { //MK - envelopes here rgb[0] = 1.0f; // red rgb[1] = pucker_sum * 2.5f; // MK from red increasing green -> yellow - adjusted multiplier for large range rgb[2] = 0.0f; } else if (pucker_sum < 0.56f) { rgb[0] = 1.0f - (pucker_sum - 0.40f) * 6.25f; // from Yellow, decrease red -> green adjusted multiplier for small range rgb[1] = 1.0f; rgb[2] = 0.0f; } else if (pucker_sum < 0.64f) { rgb[0] = 0.0f; rgb[1] = 1.0f; //green rgb[2] = (pucker_sum - 0.56f) * 12.5f; // from green, increasing blue -> cyan, adjusted multiplier for small range } else if (pucker_sum < 0.76f) { rgb[0] = 0.0f; rgb[1] = 1.0f - (pucker_sum - 0.64f) * 5.0f; // from cyan, decrease green -> blue, adjusted multiplier for small range rgb[2] = 1.0f; } else { rgb[0] = (pucker_sum - 0.76f) * 0.8f; // from blue, increase red to get magenta, adjusted multiplier for very large range rgb[1] = 0.0f; rgb[2] = 1.0f; } clamp_color(rgb); // clamp color values to legal range }
Vector3D Ray::Trace(Environment &env, int recursion) { if(recursion > MAX_RECURSION) return BACKGROUND_COLOR; Intersection inter = FindClosestIntersection(env); if(inter.obj == NULL) return BACKGROUND_COLOR; Vector3D position = source + direction * inter.dist, normal = inter.obj->Normal(position); if(normal * direction > 0) normal = -normal; Vector3D reflect_direction = direction - 2 *(normal * direction) * normal; Vector3D half_reflect = (direction + normal).Normalize(); Ray reflected_ray = Ray(position, reflect_direction); Vector3D object_color = inter.obj->GetColorAt(position), ambient_color = env.ambient_light->Color(), diffuse_color = LightTrace(position, normal, env, recursion), specular_color = reflected_ray.Trace(env, recursion + 1), refraction_color = Refract(inter, env, recursion); Vector3D total_color = ambient_color * inter.obj->surface().ambiente + diffuse_color * inter.obj->surface().difusao; total_color = combine_colors(total_color, object_color); total_color = total_color + specular_color * inter.obj->surface().especular * pow(std::max(0.0, normal * half_reflect), inter.obj->surface().brilho) + refraction_color * inter.obj->surface().transmissao; return clamp_color(total_color); }
// Calculate Cremer-Pople Pucker Parameters and convert these to a ring colour void cremer_pople_ring_color(SmallRing &ring, float *framepos, float *rgb) { int N = ring.num(); //the number of atoms in the current ring float *xring = new float[N]; float *yring = new float[N]; float *zring = new float[N]; float *displ = new float[N]; float *q = new float[N]; float *phi = new float[N]; float Q; int m; float *atompos; int curatomid; vec_zero(rgb); // set default color to black for (int i=0; i<N; i++) { curatomid = ring[i]; atompos = framepos + 3*curatomid; // pointer arithmetic is evil :) xring[i] = atompos[0]; yring[i] = atompos[1]; zring[i] = atompos[2]; } atom_displ_from_mean_plane(xring, yring, zring, displ, N); if (N==6) { //special case - pyranose rings if (cremer_pople_params(N, displ, q, phi, m, Q)) { float cosTheta = q[2]/Q; float theta = acosf(cosTheta); float sinTheta = sinf(theta); // Q is the puckering amplitude - i.e. the intensity of the pucker. // multiply by Q to show intensity, particularly for rings with // little pucker (black) // NOTE -using abs - polar positions therefore equivalent float intensity = Q; rgb[0] = fabsf(sinTheta)*intensity; rgb[1] = fabsf(cosTheta)*intensity; rgb[2] = fabsf(sinf(3.0f*phi[1])*sinTheta)*intensity; } } else if (N==5) { //special case - furanose rings if (cremer_pople_params(N, displ, q, phi, m, Q)) { rgb[0] = 0; rgb[1] = 0; rgb[2] = Q; } } // clamp color values to legal range clamp_color(rgb); delete [] xring; delete [] yring; delete [] zring; delete [] displ; delete [] q; delete [] phi; }
// given RGB values at (0,mid,1), return the correct RGB triplet static void scale_color(const float *lowRGB, const float *midRGB, const float *highRGB, float mid, float val, float scaleMin, float *rgb) { float w1 = slope3_lower(mid, val); float w2 = slope3_middle(mid, val); float w3 = slope3_upper(mid, val); float wsum = (w1 + w2 + w3); rgb[0] = (lowRGB[0]*w1 + midRGB[0]*w2 + highRGB[0]*w3) / wsum + scaleMin; rgb[1] = (lowRGB[1]*w1 + midRGB[1]*w2 + highRGB[1]*w3) / wsum + scaleMin; rgb[2] = (lowRGB[2]*w1 + midRGB[2]*w2 + highRGB[2]*w3) / wsum + scaleMin; clamp_color(rgb); }
void L1_MakeColor() { lua_Object rObj = lua_getparam(1); lua_Object gObj = lua_getparam(2); lua_Object bObj = lua_getparam(3); int r, g, b; if (!lua_isnumber(rObj)) r = 0; else r = clamp_color((int)lua_getnumber(rObj)); if (!lua_isnumber(gObj)) g = 0; else g = clamp_color((int)lua_getnumber(gObj)); if (!lua_isnumber(bObj)) b = 0; else b = clamp_color((int)lua_getnumber(bObj)); PoolColor *c = new PoolColor (r, g ,b); lua_pushusertag(c->getId(), MKTAG('C','O','L','R')); }
void Lua_V1::MakeColor() { lua_Object rObj = lua_getparam(1); lua_Object gObj = lua_getparam(2); lua_Object bObj = lua_getparam(3); int r, g, b; if (!lua_isnumber(rObj)) r = 0; else r = clamp_color((int)lua_getnumber(rObj)); if (!lua_isnumber(gObj)) g = 0; else g = clamp_color((int)lua_getnumber(gObj)); if (!lua_isnumber(bObj)) b = 0; else b = clamp_color((int)lua_getnumber(bObj)); Color c(r, g, b); lua_pushusertag(c.toEncodedValue(), MKTAG('C','O','L','R')); }