Skip to main content

辅助线绘制示例

绘制箭头

绘制可设置生命周期的箭头。

void LDrawArrowComponent::DrawLifeTimeArrow()
{
CXMVECTOR vPos = GetPosition();
CXMVECTOR vStart = vPos + m_sArrowStartLocal.GetVector();
CXMVECTOR vEnd = vPos + m_sArrowEndLocal.GetVector();

DebugDrawHelper::DrawDebugDirectionalArrow(GetScene(), DESIGN_LINE::DEFAULT,
vStart, vEnd, m_fArrowSize,
m_nArrowColor, m_fArrowLifeTime);
}

绘制盒子

绘制可设置生命周期的盒子。

void LDrawBoxComponent::DrawLifeTimeBox()
{
if (!m_bDrawPerFrame)
{
CXMVECTOR vPos = GetPosition() + m_sBoxPositionLocal.GetVector();
CXMVECTOR vAngle = GetAngle() + m_sBoxAngleLocal.GetAngle();
CXMVECTOR vQuat = FXMath::AngleToQuat(vAngle);
CXMVECTOR vExtent = m_vBoxExtent.GetVector();

DebugDrawHelper::DrawDebugBox(GetScene(), DESIGN_LINE::DEFAULT,
vPos, vExtent, vQuat, m_nBoxColor, m_fBoxLifeTime);
}
}

每帧绘制盒子。

LDrawBoxComponent::LDrawBoxComponent()
{
//////////////////////////////////////////////////////////////////////////
m_ComponentUpdate.bAllowUpdate = true;
m_ComponentUpdate.InitUpdateGroup(UPDATE_GROUP_ENUM::PrePhysics);

m_bAutoActivate = true;
//////////////////////////////////////////////////////////////////////////

m_bDrawPerFrame = true;
m_vBoxExtent = custom_vector3_t(0.5F, 0.5F, 0.5F);
m_nBoxColor = COLOR_ARGB(255, 0, 0, 255);
m_fBoxLifeTime = 5.0F;
}

void LDrawBoxComponent::DrawWireBoxPerFrame()
{
if (m_bDrawPerFrame)
{
CXMVECTOR vPos = GetPosition() + m_sBoxPositionLocal.GetVector();
CXMVECTOR vAngle = GetAngle() + m_sBoxAngleLocal.GetAngle();
CXMMATRIX vRotationMT = XMMatrixRotationRollPitchYawFromVector(vAngle);
CXMVECTOR vX = vRotationMT.r[0];
CXMVECTOR vY = vRotationMT.r[1];
CXMVECTOR vZ = vRotationMT.r[2];
CXMVECTOR vExtent = m_vBoxExtent.GetVector();

DebugDrawHelper::DrawOrientedWireBoxPerFrame(GetScene(),
DESIGN_LINE::DEFAULT, vPos, vX, vY, vZ, vExtent, m_nBoxColor,
m_DefaultDynamicColorPickID.GetColor());
}
}

void LDrawBoxComponent::UpdateComponent(float fDeltaTime,
LEVEL_UPDATE_ENUM nUpdateType,
CComponentUpdateFunction* pThisUpdateFunction)
{
LPrimitiveComponent::UpdateComponent(fDeltaTime, nUpdateType,
pThisUpdateFunction);

if (ShouldRender())
{
DrawWireBoxPerFrame();
}
}

绘制胶囊体

绘制可设置生命周期的胶囊体。

void LDrawCapsuleComponent::DrawLifeTimeCapsule()
{
if (!m_bDrawPerFrame)
{
CXMVECTOR vPos = GetPosition() + m_sCapsulePositionLocal.GetVector();
CXMVECTOR vAngle = GetAngle() + m_sCapsuleAngleLocal.GetAngle();
CXMVECTOR vQuat = FXMath::AngleToQuat(vAngle);

DebugDrawHelper::DrawDebugCapsule(GetScene(),
DESIGN_LINE::DEFAULT, vPos,
m_fCapsuleHalfHeight, m_fCapsuleRadius,
vQuat, m_nCapsuleColor, m_fCapsuleLifeTime);
}
}

每帧绘制胶囊体。

LDrawCapsuleComponent::LDrawCapsuleComponent()
{
//////////////////////////////////////////////////////////////////////////
m_ComponentUpdate.bAllowUpdate = true;
m_ComponentUpdate.InitUpdateGroup(UPDATE_GROUP_ENUM::PrePhysics);

m_bAutoActivate = true;
//////////////////////////////////////////////////////////////////////////

m_bDrawPerFrame = true;
m_fCapsuleRadius = 0.5F;
m_fCapsuleHalfHeight = 1.0F;
m_nCapsuleNumSides = 16;
m_nCapsuleColor = COLOR_ARGB(255, 0, 255, 255);
m_fCapsuleLifeTime = 5.0F;
}

void LDrawCapsuleComponent::DrawWireCapsulePerFrame()
{
if (m_bDrawPerFrame)
{
CXMVECTOR vPos = GetPosition() + m_sCapsulePositionLocal.GetVector();
CXMVECTOR vAngle = GetAngle() + m_sCapsuleAngleLocal.GetAngle();
CXMMATRIX vRotationMT = XMMatrixRotationRollPitchYawFromVector(vAngle);
CXMVECTOR vX = vRotationMT.r[0];
CXMVECTOR vY = vRotationMT.r[1];
CXMVECTOR vZ = vRotationMT.r[2];

DebugDrawHelper::DrawWireCapsulePerFrame(GetScene(),
DESIGN_LINE::DEFAULT, vPos, vX, vY, vZ,
m_nCapsuleColor, m_DefaultDynamicColorPickID.GetColor(),
m_fCapsuleRadius, m_fCapsuleHalfHeight, m_nCapsuleNumSides);
}
}

void LDrawCapsuleComponent::UpdateComponent(float fDeltaTime,
LEVEL_UPDATE_ENUM nUpdateType,
CComponentUpdateFunction* pThisUpdateFunction)
{
LPrimitiveComponent::UpdateComponent(fDeltaTime, nUpdateType,
pThisUpdateFunction);

if (ShouldRender())
{
DrawWireCapsulePerFrame();
}
}

绘制圆圈

绘制可设置生命周期的圆圈。

void LDrawCircleComponent::DrawLifeTimeCircle()
{
if (!m_bDrawPerFrame)
{
CXMVECTOR vPos = GetPosition() + m_sCirclePositionLocal.GetVector();
CXMVECTOR vAngle = GetAngle() + m_sCircleAngleLocal.GetAngle();
CXMMATRIX vRotationMT = XMMatrixRotationRollPitchYawFromVector(vAngle);
CXMVECTOR vX = vRotationMT.r[0];
CXMVECTOR vZ = vRotationMT.r[2];

DebugDrawHelper::DrawDebugCircle(GetScene(),
DESIGN_LINE::DEFAULT, vPos, vX, vZ,
m_nCircleColor, m_fCircleRadius, m_nCircleNumSides,
m_fCircleLifeTime);
}
}

每帧绘制圆圈。

LDrawCircleComponent::LDrawCircleComponent()
{
//////////////////////////////////////////////////////////////////////////
m_ComponentUpdate.bAllowUpdate = true;
m_ComponentUpdate.InitUpdateGroup(UPDATE_GROUP_ENUM::PrePhysics);

m_bAutoActivate = true;
//////////////////////////////////////////////////////////////////////////

m_bDrawPerFrame = true;
m_fCircleRadius = 0.5F;
m_nCircleNumSides = 32;
m_nCircleColor = COLOR_ARGB(255, 255, 255, 0);
m_fCircleLifeTime = 5.0F;
}

void LDrawCircleComponent::DrawCirclePerFrame()
{
if (m_bDrawPerFrame)
{
CXMVECTOR vPos = GetPosition() + m_sCirclePositionLocal.GetVector();
CXMVECTOR vAngle = GetAngle() + m_sCircleAngleLocal.GetAngle();
CXMMATRIX vRotationMT = XMMatrixRotationRollPitchYawFromVector(vAngle);
CXMVECTOR vX = vRotationMT.r[0];
CXMVECTOR vZ = vRotationMT.r[2];

DebugDrawHelper::DrawCirclePerFrame(GetScene(),
DESIGN_LINE::DEFAULT, vPos, vX, vZ,
m_nCircleColor, m_DefaultDynamicColorPickID.GetColor(),
m_fCircleRadius, m_nCircleNumSides);
}
}

void LDrawCircleComponent::UpdateComponent(float fDeltaTime,
LEVEL_UPDATE_ENUM nUpdateType,
CComponentUpdateFunction* pThisUpdateFunction)
{
LPrimitiveComponent::UpdateComponent(fDeltaTime, nUpdateType,
pThisUpdateFunction);

if (ShouldRender())
{
DrawCirclePerFrame();
}
}

绘制半圆

绘制可设置生命周期的半圆。

void LDrawHalfCircleComponent::DrawLifeTimeHalfCircle()
{
if (!m_bDrawPerFrame)
{
CXMVECTOR vPos = GetPosition() + m_sHalfCirclePositionLocal.GetVector();
CXMVECTOR vAngle = GetAngle() + m_sHalfCircleAngleLocal.GetAngle();
CXMMATRIX vRotationMT = XMMatrixRotationRollPitchYawFromVector(vAngle);
CXMVECTOR vX = vRotationMT.r[0];
CXMVECTOR vZ = vRotationMT.r[2];

DebugDrawHelper::DrawDebugHalfCircle(GetScene(),
DESIGN_LINE::DEFAULT, vPos, vX, vZ,
m_nHalfCircleColor, m_fHalfCircleRadius,
m_nHalfCircleNumSides, m_fHalfCircleLifeTime);
}
}

每帧绘制半圆。

LDrawHalfCircleComponent::LDrawHalfCircleComponent()
{
//////////////////////////////////////////////////////////////////////////
m_ComponentUpdate.bAllowUpdate = true;
m_ComponentUpdate.InitUpdateGroup(UPDATE_GROUP_ENUM::PrePhysics);

m_bAutoActivate = true;
//////////////////////////////////////////////////////////////////////////

m_bDrawPerFrame = true;
m_fHalfCircleRadius = 0.5F;
m_nHalfCircleNumSides = 16;
m_nHalfCircleColor = COLOR_ARGB(255, 255, 0, 255);
m_fHalfCircleLifeTime = 5.0F;
}

void LDrawHalfCircleComponent::DrawHalfCirclePerFrame()
{
if (m_bDrawPerFrame)
{
CXMVECTOR vPos = GetPosition() + m_sHalfCirclePositionLocal.GetVector();
CXMVECTOR vAngle = GetAngle() + m_sHalfCircleAngleLocal.GetAngle();
CXMMATRIX vRotationMT = XMMatrixRotationRollPitchYawFromVector(vAngle);
CXMVECTOR vX = vRotationMT.r[0];
CXMVECTOR vZ = vRotationMT.r[2];

DebugDrawHelper::DrawHalfCirclePerFrame(GetScene(),
DESIGN_LINE::DEFAULT, vPos, vX, vZ,
m_nHalfCircleColor, m_DefaultDynamicColorPickID.GetColor(),
m_fHalfCircleRadius, m_nHalfCircleNumSides);
}
}

void LDrawHalfCircleComponent::UpdateComponent(float fDeltaTime,
LEVEL_UPDATE_ENUM nUpdateType,
CComponentUpdateFunction* pThisUpdateFunction)
{
LPrimitiveComponent::UpdateComponent(fDeltaTime, nUpdateType,
pThisUpdateFunction);

if (ShouldRender())
{
DrawHalfCirclePerFrame();
}
}

绘制线条

绘制可设置生命周期的线条。

void LDrawLineComponent::DrawLifeTimeLine()
{
if (!m_bDrawPerFrame)
{
CXMVECTOR vPos = GetPosition();
CXMVECTOR vStart = vPos + m_sLineStartLocal.GetVector();
CXMVECTOR vEnd = vPos + m_sLineEndLocal.GetVector();

DebugDrawHelper::DrawDebugLine(GetScene(), DESIGN_LINE::DEFAULT,
vStart, vEnd, m_nLineColor, m_fLineLifeTime);
}
}

每帧绘制线条。

LDrawLineComponent::LDrawLineComponent()
{
//////////////////////////////////////////////////////////////////////////
m_ComponentUpdate.bAllowUpdate = true;
m_ComponentUpdate.InitUpdateGroup(UPDATE_GROUP_ENUM::PrePhysics);

m_bAutoActivate = true;
//////////////////////////////////////////////////////////////////////////

m_bDrawPerFrame = true;
m_sLineStartLocal = custom_vector3_t(0.0F, 0.0F, -0.5F);
m_sLineEndLocal = custom_vector3_t(0.0F, 0.0F, 0.5F);
m_nLineColor = COLOR_ARGB(255, 255, 0, 0);
m_fLineLifeTime = 5.0F;
}

void LDrawLineComponent::DrawLinePerFrame()
{
if (m_bDrawPerFrame)
{
XMVECTOR vPos = GetPosition();

DebugDrawHelper::DrawLinePerFrame(GetScene(), DESIGN_LINE::DEFAULT,
vPos + m_sLineStartLocal.GetVector(),
vPos + m_sLineEndLocal.GetVector(),
m_nLineColor, m_DefaultDynamicColorPickID.GetColor());
}
}

void LDrawLineComponent::UpdateComponent(float fDeltaTime,
LEVEL_UPDATE_ENUM nUpdateType,
CComponentUpdateFunction* pThisUpdateFunction)
{
LPrimitiveComponent::UpdateComponent(fDeltaTime, nUpdateType,
pThisUpdateFunction);

if (ShouldRender())
{
DrawLinePerFrame();
}
}

绘制多边形

通过线条列表每帧绘制多边形。

LDrawPolygonComponent::LDrawPolygonComponent()
{
//////////////////////////////////////////////////////////////////////////
m_ComponentUpdate.bAllowUpdate = true;
m_ComponentUpdate.InitUpdateGroup(UPDATE_GROUP_ENUM::PrePhysics);

m_bAutoActivate = true;
//////////////////////////////////////////////////////////////////////////

m_bWiredPolygon = true;
m_nPolygonEdges = 32;
m_fPolygonRadius = 0.5F;
m_nPolygonColor = COLOR_ARGB(255, 0, 128, 128);
m_bPolygonCacheDirty = true;
}

void LDrawPolygonComponent::DrawWiredPolygonPerFrame()
{
CXMVECTOR vPos = GetPosition() + m_sPolygonPositionLocal.GetVector();
CXMVECTOR vAngle = GetAngle() + m_sPolygonAngleLocal.GetAngle();
CXMVECTOR vQuat = FXMath::AngleToQuat(vAngle);

FTransform mtx;
mtx.SetLocation(vPos);
mtx.SetQuat(vQuat);

if (m_bPolygonCacheDirty)
{
RefreshWiredPolygonCache();
}

// Draw wired polygon with line list
DebugDrawHelper::DrawLineListPerFrame(GetScene(),
DESIGN_LINE::DEFAULT, mtx, m_WiredPolygonVertsCache,
m_WiredPolygonIndicesCache, m_DefaultDynamicColorPickID.GetColor());
}

void LDrawPolygonComponent::UpdateComponent(float fDeltaTime,
LEVEL_UPDATE_ENUM nUpdateType,
CComponentUpdateFunction* pThisUpdateFunction)
{
LPrimitiveComponent::UpdateComponent(fDeltaTime, nUpdateType,
pThisUpdateFunction);

if (ShouldRender())
{
if (m_bWiredPolygon)
{
DrawWiredPolygonPerFrame();
}
else
{
DrawPolygonPerFrame();
}
}
}

通过三角形列表每帧绘制多边形。

LDrawPolygonComponent::LDrawPolygonComponent()
{
//////////////////////////////////////////////////////////////////////////
m_ComponentUpdate.bAllowUpdate = true;
m_ComponentUpdate.InitUpdateGroup(UPDATE_GROUP_ENUM::PrePhysics);

m_bAutoActivate = true;
//////////////////////////////////////////////////////////////////////////

m_bWiredPolygon = true;
m_nPolygonEdges = 32;
m_fPolygonRadius = 0.5F;
m_nPolygonColor = COLOR_ARGB(255, 0, 128, 128);
m_bPolygonCacheDirty = true;
}

void LDrawPolygonComponent::DrawPolygonPerFrame()
{
CXMVECTOR vPos = GetPosition() + m_sPolygonPositionLocal.GetVector();
CXMVECTOR vAngle = GetAngle() + m_sPolygonAngleLocal.GetAngle();
CXMVECTOR vQuat = FXMath::AngleToQuat(vAngle);

FTransform mtx;
mtx.SetLocation(vPos);
mtx.SetQuat(vQuat);

if (m_bPolygonCacheDirty)
{
RefreshPolygonCache();
}

// Draw polygon with triangle list
DebugDrawHelper::DrawTriangleListPerFrame(GetScene(),
DESIGN_LINE::DEFAULT, mtx, m_PolygonVertsCache,
m_PolygonIndicesCache, m_DefaultDynamicColorPickID.GetColor());
}

void LDrawPolygonComponent::UpdateComponent(float fDeltaTime,
LEVEL_UPDATE_ENUM nUpdateType,
CComponentUpdateFunction* pThisUpdateFunction)
{
LPrimitiveComponent::UpdateComponent(fDeltaTime, nUpdateType,
pThisUpdateFunction);

if (ShouldRender())
{
if (m_bWiredPolygon)
{
DrawWiredPolygonPerFrame();
}
else
{
DrawPolygonPerFrame();
}
}
}

绘制球体

绘制可设置生命周期的球体。

void LDrawSphereComponent::DrawLifeTimeSphere()
{
CXMVECTOR vPos = GetPosition() + m_sSpherePositionLocal.GetVector();

DebugDrawHelper::DrawDebugSphere(GetScene(), DESIGN_LINE::DEFAULT,
vPos, m_fSphereRadius, m_nSphereSegments,
m_nSphereColor, m_fSphereLifeTime);
}

绘制三角形

每帧绘制三角形。

LDrawTriangleComponent::LDrawTriangleComponent()
{
//////////////////////////////////////////////////////////////////////////
m_ComponentUpdate.bAllowUpdate = true;
m_ComponentUpdate.InitUpdateGroup(UPDATE_GROUP_ENUM::PrePhysics);

m_bAutoActivate = true;
//////////////////////////////////////////////////////////////////////////

m_sTriangleV1Local = custom_vector3_t(0.0F, 0.0F, 0.5F);
m_sTriangleV2Local = custom_vector3_t(-0.5F, 0.0F, 0.0F);
m_sTriangleV3Local = custom_vector3_t(0.5F, 0.0F, 0.0F);
m_nTriangleV1Color = COLOR_ARGB(255, 255, 0, 0);
m_nTriangleV2Color = COLOR_ARGB(255, 0, 255, 0);
m_nTriangleV3Color = COLOR_ARGB(255, 0, 0, 255);
}

void LDrawTriangleComponent::DrawTrianglePerFrame()
{
XMVECTOR vPos = GetPosition();

DebugDrawHelper::DrawTrianglePerFrame(GetScene(), DESIGN_LINE::DEFAULT,
vPos + m_sTriangleV1Local.GetVector(), m_nTriangleV1Color,
vPos + m_sTriangleV2Local.GetVector(), m_nTriangleV2Color,
vPos + m_sTriangleV3Local.GetVector(), m_nTriangleV3Color,
m_DefaultDynamicColorPickID.GetColor());
}

void LDrawTriangleComponent::UpdateComponent(float fDeltaTime,
LEVEL_UPDATE_ENUM nUpdateType,
CComponentUpdateFunction* pThisUpdateFunction)
{
LPrimitiveComponent::UpdateComponent(fDeltaTime, nUpdateType,
pThisUpdateFunction);

if (ShouldRender())
{
DrawTrianglePerFrame();
}
}