CoriolisEvaluate (Coriolis *inst, LWTextureAccess *ta) { /* Local stuff */ double rsq, angle, value, sine, cosine, turb; /* Position Stuff */ double Pt[3], PtN[3], PP[3]; // Lets work in shader space if (ta->axis == 0) { Vec3Assign(Pt, ta->tPos[2], -ta->tPos[1], ta->tPos[0]); } else if (ta->axis == 1) { Vec3Assign(Pt, ta->tPos[0], -ta->tPos[2], ta->tPos[1]); } else { Vec3Assign(Pt, ta->tPos[0], -ta->tPos[1], ta->tPos[2]); } Vec3Copy(PtN, Pt); normalize3(PtN); rsq = xcomp(PtN) * xcomp(PtN) + ycomp(PtN) * ycomp(PtN); angle = inst->tws[0] * rsq; sine = sin( angle ); cosine = cos( angle ); PP[0] = Pt[0]*cosine - Pt[1]*sine; PP[1] = Pt[0]*sine + Pt[1]*cosine; PP[2] = Pt[2]; turb = fBm(PP, inst->inc[0], inst->lac[0], inst->oct[0], inst->fnoise); value = Abs(inst->off[0] + inst->scl[0] * turb); value = clamp(value, 0, 1); return value; }
/************* * DESCRIPTION: this is the work function * INPUT: info info structure * params pointer to user texture parameters * patch pointer to patch structure * v hit position - relative to texture axis * OUTPUT: - *************/ extern "C" void SAVEDS texture_work(HURRICANE_INFO *info, DIALOG_DATA *params, TEXTURE_PATCH *patch, VECTOR *v) { float radius, eye_weight, dist, angle, sine, cosine, val, one_minus_val; VECTOR p; eye_weight = 1.f; radius = sqrt(v->x*v->x + v->y*v->y); if(radius < params->max_radius) { // inside of hurricane dist = pow((params->max_radius - radius)/params->max_radius, 3); angle = params->twist * 2.f * PI * dist; sine = sin(angle); cosine = cos(angle); p.x = v->x * cosine - v->y * sine; p.y = v->x * sine + v->y * cosine; p.z = v->z; // subtract out "eye" of storm if(radius < 0.1f * params->max_radius) { // if in "eye" eye_weight = 1.f - (radius * 10.f / params->max_radius); // normalize // invert and make it nonlinear eye_weight = pow(1.f - eye_weight, 4); } else eye_weight = 1.f; } else { p = *v; //eye_weight = params->max_radius / radius; } if(eye_weight > 0.f) { // if in "storm" area val = fBm(&p, 1.0f, 2.0f, params->octaves, info->hashTable); val = fabs(eye_weight * (params->offset + params->scale * val)); one_minus_val = 1.f - val; if(params->diffuse_enable) { patch->diffuse.r = patch->diffuse.r * one_minus_val + params->diffuse.r * val; patch->diffuse.g = patch->diffuse.g * one_minus_val + params->diffuse.g * val; patch->diffuse.b = patch->diffuse.b * one_minus_val + params->diffuse.b * val; } if(params->reflect_enable) { patch->reflect.r = patch->reflect.r * one_minus_val + params->reflect.r * val; patch->reflect.g = patch->reflect.g * one_minus_val + params->reflect.g * val; patch->reflect.b = patch->reflect.b * one_minus_val + params->reflect.b * val; } if(params->transpar_enable) { patch->transpar.r = patch->transpar.r * one_minus_val + params->transpar.r * val; patch->transpar.g = patch->transpar.g * one_minus_val + params->transpar.g * val; patch->transpar.b = patch->transpar.b * one_minus_val + params->transpar.b * val; } } }