コード例 #1
0
//----------------------------------------------------------------------------
void NURBSCurveExample::NextConfiguration ()
{
    delete1(mTargets);
    mTargets = 0;

    const int numCtrlPoints = 14;
    const int degree = 2;
    delete1(mCtrlPoints);
    mCtrlPoints = new1<Vector2f>(numCtrlPoints);
    float* weights = new1<float>(numCtrlPoints);

    // spline
    mCtrlPoints[0] = mSpline->GetControlPoint(0);
    mCtrlPoints[1] = mSpline->GetControlPoint(1);
    mCtrlPoints[2] = 0.5f*(mSpline->GetControlPoint(1) +
        mSpline->GetControlPoint(2));
    mCtrlPoints[3] = mSpline->GetControlPoint(11);
    mCtrlPoints[4] = mSpline->GetControlPoint(12);

    // circle
    int i, j;
    for (i = 2, j = 5; i <= 10; ++i, ++j)
    {
        mCtrlPoints[j] = mSpline->GetControlPoint(i);
    }

    for (i = 0; i < numCtrlPoints; ++i)
    {
        weights[i] = 1.0f;
    }

    weights[ 6] = mSpline->GetControlWeight(3);
    weights[ 8] = mSpline->GetControlWeight(5);
    weights[10] = mSpline->GetControlWeight(7);
    weights[12] = mSpline->GetControlWeight(9);

    delete0(mSpline);
    mSpline = new0 NURBSCurve2f(5, mCtrlPoints, weights, degree, false,
        true);

    mCircle = new0 NURBSCurve2f(9, &mCtrlPoints[5], &weights[5], degree,
        true, false);

    delete1(weights);
}
コード例 #2
0
//----------------------------------------------------------------------------
void NURBSCurveExample::InitialConfiguration ()
{
    mSimTime = 0.0f;
    delete0(mSpline);
    delete0(mCircle);
    delete1(mCtrlPoints);
    delete1(mTargets);
    mCircle = 0;

    const int numCtrlPoints = 13;
    const int degree = 2;
    mCtrlPoints = new1<Vector2f>(numCtrlPoints);
    mTargets = new1<Vector2f>(numCtrlPoints);
    int i;
    for (i = 0; i < numCtrlPoints; ++i)
    {
        mCtrlPoints[i] = Vector2f(0.125f*mSize + 0.0625f*mSize*i,
            0.0625f*mSize);
    }

    mTargets[ 0] = mCtrlPoints[ 0];
    mTargets[ 1] = mCtrlPoints[ 6];
    mTargets[ 2] = Vector2f(mCtrlPoints[6].X(), mH - mD);
    mTargets[ 3] = Vector2f(mCtrlPoints[5].X(), mH - mD);
    mTargets[ 4] = Vector2f(mCtrlPoints[5].X(), mH);
    mTargets[ 5] = Vector2f(mCtrlPoints[5].X(), mH + mD);
    mTargets[ 6] = Vector2f(mCtrlPoints[6].X(), mH + mD);
    mTargets[ 7] = Vector2f(mCtrlPoints[7].X(), mH + mD);
    mTargets[ 8] = Vector2f(mCtrlPoints[7].X(), mH);
    mTargets[ 9] = Vector2f(mCtrlPoints[7].X(), mH - mD);
    mTargets[10] = Vector2f(mCtrlPoints[6].X(), mH - mD);
    mTargets[11] = mCtrlPoints[ 6];
    mTargets[12] = mCtrlPoints[12];

    float* weights = new1<float>(numCtrlPoints);
    for (i = 0; i < numCtrlPoints; ++i)
    {
        weights[i] = 1.0f;
    }

    const float modWeight = 0.3f;
    weights[3] = modWeight;
    weights[5] = modWeight;
    weights[7] = modWeight;
    weights[9] = modWeight;

    mSpline = new0 NURBSCurve2f(numCtrlPoints, mCtrlPoints, weights, degree,
        false, true);

    delete1(weights);
}
コード例 #3
0
//----------------------------------------------------------------------------
void WaterDropFormation::Configuration1 ()
{
	delete1(mTargets);
	mTargets = 0;

	const int numCtrlPoints = 14;
	const int degree = 2;
	delete1(mCtrlPoints);
	mCtrlPoints = new1<Vector2f>(numCtrlPoints);
	float* weights = new1<float>(numCtrlPoints);

	// spline
	mCtrlPoints[0] = mSpline->GetControlPoint(0);
	mCtrlPoints[1] = mSpline->GetControlPoint(1);
	mCtrlPoints[2] = 0.5f*(mSpline->GetControlPoint(1) +
	                       mSpline->GetControlPoint(2));
	mCtrlPoints[3] = mSpline->GetControlPoint(11);
	mCtrlPoints[4] = mSpline->GetControlPoint(12);

	// circle
	int i, j;
	for (i = 2, j = 5; i <= 10; ++i, ++j)
	{
		mCtrlPoints[j] = mSpline->GetControlPoint(i);
	}
	mCtrlPoints[5] = 0.5f*(mCtrlPoints[2] + mCtrlPoints[5]);
	mCtrlPoints[13] = mCtrlPoints[5];

	for (i = 0; i < numCtrlPoints; ++i)
	{
		weights[i] = 1.0f;
	}

	weights[ 6] = mSpline->GetControlWeight(3);
	weights[ 8] = mSpline->GetControlWeight(5);
	weights[10] = mSpline->GetControlWeight(7);
	weights[12] = mSpline->GetControlWeight(9);

	delete0(mSpline);
	mSpline = new0 NURBSCurve2f(5, mCtrlPoints, weights ,degree, false,
	                            true);

	// Restrict evaluation to a subinterval of the domain.
	mSpline->SetTimeInterval(0.5f, 1.0f);

	mWaterSurface->SetCurve(mSpline);

	mCircle = new0 NURBSCurve2f(9, &mCtrlPoints[5], &weights[5], degree,
	                            true, false);

	delete1(weights);

	// Restrict evaluation to a subinterval of the domain.  Why 0.375?  The
	// circle NURBS is a loop and not open.  The curve is constructed with
	// iDegree (2) replicated control points.  Although the curve is
	// geometrically symmetric about the vertical axis, it is not symmetric
	// in t about the half way point (0.5) of the domain [0,1].
	mCircle->SetTimeInterval(0.375f, 1.0f);

	// Create water drop.  The outside view value is set to 'false' because
	// the curve (x(t),z(t)) has the property dz/dt < 0.  If the curve
	// instead had the property dz/dt > 0, then 'true' is the correct value
	// for the outside view.
	VertexFormat* vformat = VertexFormat::Create(2,
	                        VertexFormat::AU_POSITION, VertexFormat::AT_FLOAT3, 0,
	                        VertexFormat::AU_TEXCOORD, VertexFormat::AT_FLOAT2, 0);

	mWaterDrop = new0 RevolutionSurface(mCircle, mCtrlPoints[9].X(),
	                                    RevolutionSurface::REV_SPHERE_TOPOLOGY, 32, 16, false, false,
	                                    vformat);
	mWaterDrop->SetEffectInstance(
	    mWaterEffect->CreateInstance(mWaterTexture));

	mWaterRoot->AttachChild(mWaterDrop);
}
コード例 #4
0
//----------------------------------------------------------------------------
void WaterDropFormation::Configuration0 ()
{
	// Application loops between Configuration0() and Configuration1().
	// Delete all the objects from "1" when restarting with "0".
	delete1(mCtrlPoints);
	delete1(mTargets);
	delete0(mSpline);
	delete0(mCircle);
	mCircle = 0;
	mSimTime = 0.0f;
	mSimDelta = 0.05f;

	mWaterRoot->DetachChildAt(0);
	mWaterRoot->DetachChildAt(1);
	mWaterSurface = 0;
	mWaterDrop = 0;

	// Create water surface curve of revolution.
	const int numCtrlPoints = 13;
	const int degree = 2;
	mCtrlPoints = new1<Vector2f>(numCtrlPoints);
	mTargets = new1<Vector2f>(numCtrlPoints);
	int i;
	for (i = 0; i < numCtrlPoints; ++i)
	{
		mCtrlPoints[i] = Vector2f(0.125f + 0.0625f*i, 0.0625f);
	}

	float h = 0.5f;
	float d = 0.0625f;
	float extra = 0.1f;

	mTargets[ 0] = mCtrlPoints[ 0];
	mTargets[ 1] = mCtrlPoints[ 6];
	mTargets[ 2] = Vector2f(mCtrlPoints[6].X(), h - d - extra);
	mTargets[ 3] = Vector2f(mCtrlPoints[5].X(), h - d - extra);
	mTargets[ 4] = Vector2f(mCtrlPoints[5].X(), h);
	mTargets[ 5] = Vector2f(mCtrlPoints[5].X(), h + d);
	mTargets[ 6] = Vector2f(mCtrlPoints[6].X(), h + d);
	mTargets[ 7] = Vector2f(mCtrlPoints[7].X(), h + d);
	mTargets[ 8] = Vector2f(mCtrlPoints[7].X(), h);
	mTargets[ 9] = Vector2f(mCtrlPoints[7].X(), h - d - extra);
	mTargets[10] = Vector2f(mCtrlPoints[6].X(), h - d - extra);
	mTargets[11] = mCtrlPoints[ 6];
	mTargets[12] = mCtrlPoints[12];

	float* weights = new1<float>(numCtrlPoints);
	for (i = 0; i < numCtrlPoints; ++i)
	{
		weights[i] = 1.0f;
	}

	const float modWeight = 0.3f;
	weights[3] = modWeight;
	weights[5] = modWeight;
	weights[7] = modWeight;
	weights[9] = modWeight;

	mSpline = new0 NURBSCurve2f(numCtrlPoints, mCtrlPoints, weights, degree,
	                            false, true);

	// Restrict evaluation to a subinterval of the domain.
	mSpline->SetTimeInterval(0.5f, 1.0f);

	delete1(weights);

	// Create the water surface.
	VertexFormat* vformat = VertexFormat::Create(2,
	                        VertexFormat::AU_POSITION, VertexFormat::AT_FLOAT3, 0,
	                        VertexFormat::AU_TEXCOORD, VertexFormat::AT_FLOAT2, 0);

	mWaterSurface = new0 RevolutionSurface(mSpline, mCtrlPoints[6].X(),
	                                       RevolutionSurface::REV_DISK_TOPOLOGY, 32, 16, false, true, vformat);
	mWaterSurface->SetEffectInstance(
	    mWaterEffect->CreateInstance(mWaterTexture));

	mWaterRoot->AttachChild(mWaterSurface);
	mWaterRoot->Update();
}