Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
/*************
 * 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;
		}
	}
}