#include "ElementRendererHeaders.hpp" #include "PointCloudElement.hpp" #include //############################################################################ //############################ PointCloudElement ################################ //############################################################################ ElementRenderer::PointCloudElement::ClassData* ElementRenderer::PointCloudElement::DefaultData = NULL; ElementRenderer::Element::DrawMethod ElementRenderer::PointCloudElement::DrawMethods[DrawStateCount]= { // // No billboarding // DRAW_METHOD(PointCloudElement, Inherit), DRAW_METHOD(PointCloudElement, Override) }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void ElementRenderer::PointCloudElement::InitializeClass() { Verify(!DefaultData); DefaultData = new ClassData( PointCloudElementClassID, "ElementRenderer::PointCloudElement", BaseClass::DefaultData, reinterpret_cast(&Make) ); Register_Object(DefaultData); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void ElementRenderer::PointCloudElement::TerminateClass() { Unregister_Object(DefaultData); delete DefaultData; DefaultData = NULL; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ElementRenderer::PointCloudElement::PointCloudElement( Stuff::MemoryStream *stream, int version ): Element(DefaultData, stream, version) { Check_Pointer(this); Check_Object(stream); unsigned index = (m_state>>DrawStateBit) & DrawStateMask; Verify(index < DrawStateCount); m_draw = DrawMethods[index]; // //--------------------------------- // Create the shape from the stream //--------------------------------- // #if 0 m_MLRPointCloud = MidLevelRenderer::MLRPointCloud::Make(stream); Register_Object(m_MLRPointCloud); #endif } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ElementRenderer::PointCloudElement::PointCloudElement(unsigned max_points): Element(DefaultData) { Check_Pointer(this); unsigned index = (m_state>>DrawStateBit) & DrawStateMask; Verify(index < DrawStateCount); m_draw = DrawMethods[index]; gos_PushCurrentHeap(MidLevelRenderer::Heap); m_MLRPointCloud = new MidLevelRenderer::MLRPointCloud(max_points); Register_Object(m_MLRPointCloud); gos_PopCurrentHeap(); m_MLRPointCloud->TurnAllOn(); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ElementRenderer::PointCloudElement::~PointCloudElement() { Check_Object(this); Unregister_Object(m_MLRPointCloud); delete m_MLRPointCloud; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ElementRenderer::PointCloudElement* ElementRenderer::PointCloudElement::Make( Stuff::MemoryStream *stream, int version, ShapeHolder shapes ) { Check_Object(stream); gos_PushCurrentHeap(g_Heap); PointCloudElement *element = new PointCloudElement(stream, version); gos_PopCurrentHeap(); return element; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void ElementRenderer::PointCloudElement::Save(Stuff::MemoryStream *stream) { Check_Object(this); Check_Object(stream); BaseClass::Save(stream); // //----------------------------- // Save the shape to the stream //----------------------------- // #if 0 Check_Object(m_MLRPointCloud); m_MLRPointCloud->Save(stream); #endif } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void ElementRenderer::PointCloudElement::TestInstance() { Verify(IsDerivedFrom(DefaultData)); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void ElementRenderer::PointCloudElement::AttachChild(Element *child) { Check_Object(this); Check_Object(child); STOP(("PointCloud elements can't have children!")); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void ElementRenderer::PointCloudElement::DetachChild(Element *child) { Check_Object(this); Check_Object(child); STOP(("PointCloud elements can't have children!")); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // bool ElementRenderer::PointCloudElement::CastCulledRay(CollisionQuery *query) { Check_Object(this); Check_Object(query); STOP(("PointCloud is not collidable!")); return false; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ElementRenderer::Element* ElementRenderer::PointCloudElement::FindSmallestElementContainingCulled(SphereTest *test) { Check_Object(this); Check_Object(test); STOP(("PointCloud is not collidable!")); return NULL; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void ElementRenderer::PointCloudElement::SetDrawState() { Check_Object(this); unsigned index = (m_state>>DrawStateBit) & DrawStateMask; Verify(index < DrawStateCount); m_draw = DrawMethods[index]; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void ElementRenderer::PointCloudElement::InheritDrawMethod( CameraElement *camera, const StateChange *inherited_state, int culling_state ) { Check_Object(this); Check_Object(inherited_state); Check_Object(camera); Verify(culling_state != -1); #if defined(_ARMOR) if (!culling_state) Verify(!Cull(camera)); #endif // //-------------------------------------- // Draw our bounds if we are supposed to //-------------------------------------- // #if defined(LAB_ONLY) Callback *callback = GetCallbackSet(); unsigned index = GetCallbackIndex(); if (callback && callback[index]) { Check_Pointer(callback[index]); (*callback[index])(camera, inherited_state, culling_state, this); } #endif // //---------------------------- // Set up the draw information //---------------------------- // MidLevelRenderer::DrawEffectInformation info; Check_Object(m_MLRPointCloud); info.effect = m_MLRPointCloud; info.clippingFlags.SetClippingState(culling_state); Check_Object(&m_localToWorld); info.effectToWorld = &m_localToWorld; info.state = inherited_state->GetMLRState(); // //--------------- // Draw the shape //--------------- // MidLevelRenderer::MLRClipper *clipper = camera->GetClipper(); Check_Object(clipper); Stop_Timer(Graph_Traversal); ELEMENT_RENDER("Culling::PointCloud::Inherited"); Start_Timer(Draw_Effects); clipper->DrawEffect(&info); Stop_Timer(Draw_Effects); Start_Timer(Graph_Traversal); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void ElementRenderer::PointCloudElement::OverrideDrawMethod( CameraElement *camera, const StateChange *inherited_state, int culling_state ) { Check_Object(this); Check_Object(inherited_state); Check_Object(camera); Verify(culling_state != -1); #if defined(_ARMOR) if (!culling_state) Verify(!Cull(camera)); #endif // //------------------- // Mix the properties //------------------- // Check_Object(m_stateChange); StateChange mixed; mixed.Mix(*inherited_state, *m_stateChange); // //-------------------------------------- // Draw our bounds if we are supposed to //-------------------------------------- // #if defined(LAB_ONLY) Callback *callback = GetCallbackSet(); unsigned index = GetCallbackIndex(); if (callback && callback[index]) { Check_Pointer(callback[index]); (*callback[index])(camera, inherited_state, culling_state, this); } #endif // //---------------------------- // Set up the draw information //---------------------------- // MidLevelRenderer::DrawEffectInformation info; Check_Object(m_MLRPointCloud); info.effect = m_MLRPointCloud; info.clippingFlags.SetClippingState(culling_state); Check_Object(&m_localToWorld); info.effectToWorld = &m_localToWorld; info.state = mixed.GetMLRState(); // //--------------- // Draw the shape //--------------- // MidLevelRenderer::MLRClipper *clipper = camera->GetClipper(); Check_Object(clipper); Stop_Timer(Graph_Traversal); ELEMENT_RENDER("Culling::PointCloud::Overridden"); Start_Timer(Draw_Effects); clipper->DrawEffect(&info); Stop_Timer(Draw_Effects); Start_Timer(Graph_Traversal); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // int ElementRenderer::PointCloudElement::CountTriangles() { Check_Object(this); STOP(("Not implemented")); return 0; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void ElementRenderer::PointCloudElement::SetDataPointers( const unsigned *used_points, const Stuff::Point3D *point_data, const Stuff::RGBAColor *color_data ) { Check_Pointer(this); Check_Pointer(used_points); Check_Pointer(point_data); Check_Pointer(color_data); Check_Object(m_MLRPointCloud); m_MLRPointCloud->SetData( reinterpret_cast(used_points), point_data, color_data ); }