From 15740faf9fe9fe4be08965098bbf2947e096aeeb Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 14 Aug 2019 22:50:43 +0800 Subject: +Unity Runtime code --- Runtime/Filters/Misc/LineRenderer.cpp | 195 ++++++++++++++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 Runtime/Filters/Misc/LineRenderer.cpp (limited to 'Runtime/Filters/Misc/LineRenderer.cpp') diff --git a/Runtime/Filters/Misc/LineRenderer.cpp b/Runtime/Filters/Misc/LineRenderer.cpp new file mode 100644 index 0000000..1bab153 --- /dev/null +++ b/Runtime/Filters/Misc/LineRenderer.cpp @@ -0,0 +1,195 @@ +#include "UnityPrefix.h" +#include "LineRenderer.h" +#include "Runtime/Mono/MonoManager.h" +#include "Runtime/Graphics/Transform.h" +#include "Runtime/Serialize/TransferFunctions/SerializeTransfer.h" +#include "Runtime/Serialize/TransferFunctions/TransferNameConversions.h" +#include "Runtime/Camera/RenderManager.h" +#include "Runtime/Camera/Camera.h" +#include "Runtime/Shaders/VBO.h" +#include "Runtime/GfxDevice/GfxDevice.h" +#include "Runtime/Profiler/Profiler.h" + +IMPLEMENT_CLASS_INIT_ONLY (LineRenderer) +IMPLEMENT_OBJECT_SERIALIZE (LineRenderer) + +LineRenderer::LineRenderer (MemLabelId label, ObjectCreationMode mode) +: Super(kRendererLine, label, mode) +{ + SetVisible (false); +} + +LineRenderer::~LineRenderer () +{ +} + +void LineRenderer::InitializeClass () +{ + RegisterAllowNameConversion (LineRenderer::GetClassStringStatic(), "m_WorldSpace", "m_UseWorldSpace"); +} + + +void LineRenderer::SetVertexCount(int count) +{ + if(count < 0) + { + count = 0; + ErrorString ("LineRenderer.SetVertexCount: Vertex count can't be set to negative value!"); + } + UpdateManagerState( true ); + m_Positions.resize(count); + SetVisible (m_Positions.size() >= 2); + SetDirty(); + BoundsChanged(); +} + +void LineRenderer::AwakeFromLoad(AwakeFromLoadMode awakeMode) +{ + Super::AwakeFromLoad(awakeMode); + SetVisible (m_Positions.size() >= 2); + + if ((awakeMode & kDidLoadFromDisk) == 0) + BoundsChanged(); +} + +void LineRenderer::SetPosition (int index, const Vector3f& position) +{ + SetDirty(); + UpdateManagerState( true ); + if (index < m_Positions.size() && index >= 0) + m_Positions[index] = position; + else + ErrorString("LineRenderer.SetPosition index out of bounds!"); + BoundsChanged(); +} + +PROFILER_INFORMATION(gSubmitVBOProfileLine, "Mesh.SubmitVBO", kProfilerRender) + + +void LineRenderer::Render (int subsetIndex, const ChannelAssigns& channels) +{ + if( m_Positions.size() < 2 ) + return; + + Vector3f* lineInVerts = NULL; + ALLOC_TEMP(lineInVerts, Vector3f, m_Positions.size()); + + MinMaxAABB mmAABB = MinMaxAABB(Vector3f::zero, Vector3f::zero); + + if (m_UseWorldSpace) + { + memcpy (lineInVerts, &m_Positions[0], m_Positions.size()*sizeof(Vector3f)); + } + else + { + Transform& tc = GetComponent(Transform); + int idx = 0; + for (PositionVector::iterator j = m_Positions.begin(); j != m_Positions.end(); ++j, ++idx) + { + lineInVerts[idx] = tc.TransformPoint(*j); + } + } + + // Get VBO chunk + int stripCount = m_Positions.size() * 2; + GfxDevice& device = GetGfxDevice(); + DynamicVBO& vbo = device.GetDynamicVBO(); + LineVertex* vbPtr; + if( !vbo.GetChunk( (1< inline +void LineRenderer::Transfer (TransferFunction& transfer) { + Super::Transfer (transfer); + TRANSFER_SIMPLE (m_Positions); + TRANSFER_SIMPLE (m_Parameters); + TRANSFER (m_UseWorldSpace); +} -- cgit v1.1-26-g67d0