📄 tube.cpp
字号:
#include "gosFXHeaders.hpp"
#include <MLR\MLRIndexedTriangleCloud.hpp>
//==========================================================================//
// File: gosFX_Tube.cpp //
// Contents: Base gosFX::Tube Component //
//---------------------------------------------------------------------------//
// Copyright (C) Microsoft Corporation. All rights reserved. //
//===========================================================================//
//
//############################################################################
//######################## gosFX::Tube__Specification #############################
//############################################################################
//------------------------------------------------------------------------------
//
gosFX::Tube__Specification::Tube__Specification(
Stuff::MemoryStream *stream,
int gfx_version
):
Effect__Specification(TubeClassID, stream, gfx_version)
{
Check_Pointer(this);
Check_Object(stream);
Verify(gos_GetCurrentHeap() == Heap);
//
//-------------------
// Load in the curves
//-------------------
//
m_profilesPerSecond.Load(stream, gfx_version);
m_pLifeSpan.Load(stream, gfx_version);
m_emitterSizeX.Load(stream, gfx_version);
m_emitterSizeY.Load(stream, gfx_version);
m_emitterSizeZ.Load(stream, gfx_version);
m_minimumDeviation.Load(stream, gfx_version);
m_maximumDeviation.Load(stream, gfx_version);
m_pDisplacement.Load(stream, gfx_version);
if (gfx_version < 12)
{
m_pScale.m_ageCurve.SetCurve(1.0f);
m_pScale.m_seeded = false;
m_pScale.m_seedCurve.SetCurve(1.0f);
}
else
m_pScale.Load(stream, gfx_version);
m_pRed.Load(stream, gfx_version);
m_pGreen.Load(stream, gfx_version);
m_pBlue.Load(stream, gfx_version);
m_pAlpha.Load(stream, gfx_version);
m_pUOffset.Load(stream, gfx_version);
m_pVOffset.Load(stream, gfx_version);
m_pUSize.Load(stream, gfx_version);
m_pVSize.Load(stream, gfx_version);
int type;
*stream >> m_maxProfileCount >> type >> m_insideOut;
m_profileType = static_cast<ProfileType>(type);
CalculateUBias(true);
BuildTemplate();
}
//------------------------------------------------------------------------------
//
gosFX::Tube__Specification::Tube__Specification():
Effect__Specification(TubeClassID)
{
Verify(gos_GetCurrentHeap() == Heap);
m_maxProfileCount = 0;
m_profileType = e_Ribbon;
m_insideOut = false;
m_UBias = 0.0f;
Check_Pointer(this);
}
//------------------------------------------------------------------------------
//
gosFX::Tube__Specification*
gosFX::Tube__Specification::Make(
Stuff::MemoryStream *stream,
int gfx_version
)
{
Check_Object(stream);
gos_PushCurrentHeap(Heap);
Tube__Specification *spec =
new gosFX::Tube__Specification(stream, gfx_version);
gos_PopCurrentHeap();
return spec;
}
//------------------------------------------------------------------------------
//
void
gosFX::Tube__Specification::Save(Stuff::MemoryStream *stream)
{
Check_Object(this);
Check_Object(stream);
Effect__Specification::Save(stream);
//
//----------------
// Save our curves
//----------------
//
m_profilesPerSecond.Save(stream);
m_pLifeSpan.Save(stream);
m_emitterSizeX.Save(stream);
m_emitterSizeY.Save(stream);
m_emitterSizeZ.Save(stream);
m_minimumDeviation.Save(stream);
m_maximumDeviation.Save(stream);
m_pDisplacement.Save(stream);
m_pScale.Save(stream);
m_pRed.Save(stream);
m_pGreen.Save(stream);
m_pBlue.Save(stream);
m_pAlpha.Save(stream);
m_pUOffset.Save(stream);
m_pVOffset.Save(stream);
m_pUSize.Save(stream);
m_pVSize.Save(stream);
*stream << m_maxProfileCount << static_cast<int>(m_profileType);
*stream << m_insideOut;
}
//------------------------------------------------------------------------------
//
void
gosFX::Tube__Specification::BuildDefaults()
{
Check_Object(this);
Effect__Specification::BuildDefaults();
m_profilesPerSecond.SetCurve(4.0f);
m_pLifeSpan.SetCurve(1.0f);
m_emitterSizeX.SetCurve(0.0f);
m_emitterSizeY.SetCurve(0.0f);
m_emitterSizeZ.SetCurve(0.0f);
m_minimumDeviation.SetCurve(0.0f);
m_maximumDeviation.SetCurve(0.0f);
m_pDisplacement.m_ageCurve.SetCurve(0.0f);
m_pDisplacement.m_seeded = false;
m_pDisplacement.m_seedCurve.SetCurve(1.0f);
m_pScale.m_ageCurve.SetCurve(1.0f);
m_pScale.m_seeded = false;
m_pScale.m_seedCurve.SetCurve(1.0f);
m_pRed.m_ageCurve.SetCurve(1.0f);
m_pRed.m_seeded = false;
m_pRed.m_seedCurve.SetCurve(1.0f);
m_pGreen.m_ageCurve.SetCurve(1.0f);
m_pGreen.m_seeded = false;
m_pGreen.m_seedCurve.SetCurve(1.0f);
m_pBlue.m_ageCurve.SetCurve(1.0f);
m_pBlue.m_seeded = false;
m_pBlue.m_seedCurve.SetCurve(1.0f);
m_pAlpha.m_ageCurve.SetCurve(1.0f);
m_pAlpha.m_seeded = false;
m_pAlpha.m_seedCurve.SetCurve(1.0f);
m_pUOffset.m_ageCurve.SetCurve(0.0f);
m_pUOffset.m_seeded = false;
m_pUOffset.m_seedCurve.SetCurve(1.0f);
m_pVOffset.m_ageCurve.SetCurve(0.0f);
m_pVOffset.m_seeded = false;
m_pVOffset.m_seedCurve.SetCurve(1.0f);
m_pUSize.m_ageCurve.SetCurve(1.0f);
m_pUSize.m_seeded = false;
m_pUSize.m_seedCurve.SetCurve(1.0f);
m_pVSize.m_ageCurve.SetCurve(1.0f);
m_pVSize.m_seeded = false;
m_pVSize.m_seedCurve.SetCurve(1.0f);
m_maxProfileCount = 2;
m_profileType = e_Triangle;
m_insideOut = false;
CalculateUBias(false);
BuildTemplate();
}
//------------------------------------------------------------------------------
//
bool
gosFX::Tube__Specification::IsDataValid(bool fix_data)
{
Check_Object(this);
if(m_maxProfileCount<2)
if(fix_data)
{
m_maxProfileCount=2;
PAUSE(("Warning: Value \"maxProfileCount\" in Effect \"%s\" Is Out of Range and has been Reset",(char *)m_name));
}
else
return false;
Stuff::Scalar min,max;
m_pScale.ExpensiveComputeRange(&min,&max);
if(min<0.0f)
if(fix_data)
{
m_pScale.m_ageCurve.SetCurve(1.0f);
m_pScale.m_seeded = false;
m_pScale.m_seedCurve.SetCurve(1.0f);
PAUSE(("Warning: Curve \"pScale\" in Effect \"%s\" Is Out of Range and has been Reset",(char *)m_name));
}
else
return false;
Stuff::Scalar max_offset, min_offset;
Stuff::Scalar max_scale, min_scale;
m_pUSize.ExpensiveComputeRange(&min_scale, &max_scale);
Stuff::Scalar lower = min_scale;
if (lower > 0.0f)
lower = 0.0f;
Stuff::Scalar upper = max_scale;
//
//------------------------------------
// Calculate the worst case UV offsets
//------------------------------------
//
m_pVOffset.ExpensiveComputeRange(&min_offset, &max_offset);
lower += min_offset;
upper += max_offset;
if (upper > 99.0f || lower < -99.0f)
{
if(fix_data)
{
m_pVOffset.m_ageCurve.SetCurve(0.0f);
m_pVOffset.m_seeded = false;
m_pVOffset.m_seedCurve.SetCurve(1.0f);
PAUSE(("Warning: Curve \"VOffset\" in Effect \"%s\" Is Out of Range and has been Reset",(char *)m_name));
}
else
return false;
}
m_pVSize.ExpensiveComputeRange(&min_scale, &max_scale);
lower = min_scale;
if (lower > 0.0f)
lower = 0.0f;
upper = max_scale;
//
//------------------------------------
// Calculate the worst case UV offsets
//------------------------------------
//
max_offset, min_offset;
m_pUOffset.ExpensiveComputeRange(&min_offset, &max_offset);
lower += min_offset;
upper += max_offset;
if (upper > 99.0f || lower < -99.0f)
{
if(fix_data)
{
m_pUOffset.m_ageCurve.SetCurve(0.0f);
m_pUOffset.m_seeded = false;
m_pUOffset.m_seedCurve.SetCurve(1.0f);
PAUSE(("Warning: Curve \"UOffset\" in Effect \"%s\" Is Out of Range and has been Reset",(char *)m_name));
}
else
return false;
}
return Effect__Specification::IsDataValid(fix_data);
}
//------------------------------------------------------------------------------
//
void
gosFX::Tube__Specification::Copy(Tube__Specification *spec)
{
Check_Object(this);
Check_Object(spec);
Verify(gos_GetCurrentHeap() == Heap);
Effect__Specification::Copy(spec);
//
//----------------
// Copy the curves
//----------------
//
gos_PushCurrentHeap(Heap);
m_profilesPerSecond = spec->m_profilesPerSecond;
m_pLifeSpan = spec->m_pLifeSpan;
m_emitterSizeX = spec->m_emitterSizeX;
m_emitterSizeY = spec->m_emitterSizeY;
m_emitterSizeZ = spec->m_emitterSizeZ;
m_minimumDeviation = spec->m_minimumDeviation;
m_maximumDeviation = spec->m_maximumDeviation;
m_pDisplacement = spec->m_pDisplacement;
m_pScale = spec->m_pScale;
m_pRed = spec->m_pRed;
m_pGreen = spec->m_pGreen;
m_pBlue = spec->m_pBlue;
m_pAlpha = spec->m_pAlpha;
m_pUOffset = spec->m_pUOffset;
m_pVOffset = spec->m_pVOffset;
m_pUSize = spec->m_pUSize;
m_pVSize = spec->m_pVSize;
m_maxProfileCount = spec->m_maxProfileCount;
m_profileType = spec->m_profileType;
m_vertices = spec->m_vertices;
m_uvs = spec->m_uvs;
m_insideOut = spec->m_insideOut;
m_UBias = spec->m_UBias;
gos_PopCurrentHeap();
}
//------------------------------------------------------------------------------
//
void
gosFX::Tube__Specification::BuildTemplate()
{
Check_Object(this);
switch (m_profileType)
{
case e_Ribbon:
case e_AlignedRibbon:
m_vertices.SetLength(2);
m_vertices[0] = Stuff::Vector3D(1.0f, 0.0f, 0.0f);
m_vertices[1] = Stuff::Vector3D(-1.0f, 0.0f, 0.0f);
m_uvs.SetLength(2);
m_uvs[0] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.0f);
m_uvs[1] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 1.0f);
break;
case e_VerticalRibbon:
m_vertices.SetLength(2);
m_vertices[0] = Stuff::Vector3D(0.0f, 0.0f, -1.0f);
m_vertices[1] = Stuff::Vector3D(0.0f, 0.0f, 1.0f);
m_uvs.SetLength(2);
m_uvs[0] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.0f);
m_uvs[1] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 1.0f);
break;
case e_Triangle:
m_vertices.SetLength(4);
m_vertices[0] = Stuff::Vector3D(0.0f, 0.0f, 1.0f);
m_vertices[1] = Stuff::Vector3D(-0.8660254f, 0.0f, -0.5f);
m_vertices[2] = Stuff::Vector3D(0.8660254f, 0.0f, -0.5f);
m_vertices[3] = Stuff::Vector3D(0.0f, 0.0f, 1.0f);
m_uvs.SetLength(4);
m_uvs[0] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.0f);
m_uvs[1] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 1.0f/3.0f);
m_uvs[2] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 2.0f/3.0f);
m_uvs[3] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 1.0f);
break;
case e_Square:
m_vertices.SetLength(5);
m_vertices[0] = Stuff::Vector3D(0.0f, 0.0f, 1.0f);
m_vertices[1] = Stuff::Vector3D(-1.0f, 0.0f, 0.0f);
m_vertices[2] = Stuff::Vector3D(0.0f, 0.0f, -1.0f);
m_vertices[3] = Stuff::Vector3D(1.0f, 0.0f, 0.0f);
m_vertices[4] = Stuff::Vector3D(0.0f, 0.0f, 1.0f);
m_uvs.SetLength(5);
m_uvs[0] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.0f);
m_uvs[1] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.25f);
m_uvs[2] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.5f);
m_uvs[3] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.75f);
m_uvs[4] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 1.0f);
break;
case e_Cross:
m_vertices.SetLength(5);
m_vertices[0] = Stuff::Vector3D(0.0f, 0.0f, 0.0f);
m_vertices[1] = Stuff::Vector3D(0.0f, 0.0f, 1.0f);
m_vertices[2] = Stuff::Vector3D(-1.0f, 0.0f, 0.0f);
m_vertices[3] = Stuff::Vector3D(0.0f, 0.0f, -1.0f);
m_vertices[4] = Stuff::Vector3D(1.0f, 0.0f, 0.0f);
m_uvs.SetLength(5);
m_uvs[0] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.0f);
m_uvs[1] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 1.0f);
m_uvs[2] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 1.0f);
m_uvs[3] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 1.0f);
m_uvs[4] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 1.0f);
break;
case e_Pentagon:
m_vertices.SetLength(6);
m_vertices[0] = Stuff::Vector3D(0.0f, 0.0f, 1.0f);
m_vertices[1] = Stuff::Vector3D(-0.9510565f, 0.0f, 0.309017f);
m_vertices[2] = Stuff::Vector3D(-0.58778525f, 0.0f, -0.8090167f);
m_vertices[3] = Stuff::Vector3D(0.58778525f, 0.0f, -0.8090167f);
m_vertices[4] = Stuff::Vector3D(0.9510565f, 0.0f, 0.309017f);
m_vertices[5] = Stuff::Vector3D(0.0f, 0.0f, 1.0f);
m_uvs.SetLength(6);
m_uvs[0] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.0f);
m_uvs[1] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.2f);
m_uvs[2] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.4f);
m_uvs[3] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.6f);
m_uvs[4] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.8f);
m_uvs[5] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 1.0f);
break;
case e_Hexagon:
m_vertices.SetLength(7);
m_vertices[0] = Stuff::Vector3D(0.0f, 0.0f, 1.0f);
m_vertices[1] = Stuff::Vector3D(-0.8660254f, 0.0f, 0.5f);
m_vertices[2] = Stuff::Vector3D(-0.8660254f, 0.0f, -0.5f);
m_vertices[3] = Stuff::Vector3D(0.0f, 0.0f, -1.0f);
m_vertices[4] = Stuff::Vector3D(0.8660254f, 0.0f, -0.5f);
m_vertices[5] = Stuff::Vector3D(0.8660254f, 0.0f, 0.5f);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -