123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- #include "gosFXHeaders.hpp"
- //==========================================================================//
- // File: gosFX_Shape.cpp //
- // Contents: Base gosFX::Shape Component //
- //---------------------------------------------------------------------------//
- // Copyright (C) Microsoft Corporation. All rights reserved. //
- //===========================================================================//
- //
- //############################################################################
- //######################## gosFX::Shape__Specification #############################
- //############################################################################
- //------------------------------------------------------------------------------
- //
- gosFX::Shape__Specification::Shape__Specification(
- Stuff::MemoryStream *stream,
- int gfx_version
- ):
- Singleton__Specification(gosFX::ShapeClassID, stream, gfx_version)
- {
- Check_Pointer(this);
- Verify(m_class == ShapeClassID);
- Verify(gos_GetCurrentHeap() == Heap);
- //
- //---------------
- // Load the shape
- //---------------
- //
- m_shape =
- MidLevelRenderer::MLRShape::Make(
- stream,
- MidLevelRenderer::ReadMLRVersion(stream)
- );
- Register_Object(m_shape);
- *stream >> m_radius;
- }
- //------------------------------------------------------------------------------
- //
- gosFX::Shape__Specification::Shape__Specification(
- MidLevelRenderer::MLRShape *shape
- ):
- Singleton__Specification(gosFX::ShapeClassID)
- {
- Check_Pointer(this);
- Verify(gos_GetCurrentHeap() == Heap);
- m_shape = NULL;
- SetShape(shape);
- }
- //------------------------------------------------------------------------------
- //
- gosFX::Shape__Specification::~Shape__Specification()
- {
- Check_Object(this);
- if (m_shape)
- {
- Check_Object(m_shape);
- m_shape->DetachReference();
- }
- }
- //------------------------------------------------------------------------------
- //
- gosFX::Shape__Specification*
- gosFX::Shape__Specification::Make(
- Stuff::MemoryStream *stream,
- int gfx_version
- )
- {
- Check_Object(stream);
- gos_PushCurrentHeap(Heap);
- Shape__Specification *spec =
- new gosFX::Shape__Specification(stream, gfx_version);
- gos_PopCurrentHeap();
- return spec;
- }
- //------------------------------------------------------------------------------
- //
- void
- gosFX::Shape__Specification::Save(Stuff::MemoryStream *stream)
- {
- Check_Object(this);
- Check_Object(stream);
- Singleton__Specification::Save(stream);
- MidLevelRenderer::WriteMLRVersion(stream);
- m_shape->Save(stream);
- *stream << m_radius;
- }
- //------------------------------------------------------------------------------
- //
- void
- gosFX::Shape__Specification::Copy(Shape__Specification *spec)
- {
- Check_Object(this);
- Check_Object(spec);
- Singleton__Specification::Copy(spec);
- gos_PushCurrentHeap(Heap);
- m_radius = spec->m_radius;
- m_shape = spec->m_shape;
- gos_PopCurrentHeap();
- Check_Object(m_shape);
- m_shape->AttachReference();
- }
- //------------------------------------------------------------------------------
- //
- void
- gosFX::Shape__Specification::SetShape(MidLevelRenderer::MLRShape *shape)
- {
- Check_Object(this);
- //
- //------------------------------------
- // Detach the old shape if it is there
- //------------------------------------
- //
- if (m_shape)
- {
- Check_Object(m_shape);
- m_shape->DetachReference();
- }
- //
- //------------------------------------
- // Attach the new shape if it is there
- //------------------------------------
- //
- if (shape)
- {
- Check_Object(shape);
- m_shape = shape;
- m_shape->AttachReference();
- //
- //-----------------------------------------------------------------
- // Get the radius of the bounding sphere. This will be the largest
- // distance any point is from the origin
- //-----------------------------------------------------------------
- //
- m_radius = 0.0f;
- int count = m_shape->GetNum();
- for (int i=0; i<count; ++i)
- {
- MidLevelRenderer::MLRPrimitiveBase *primitive = m_shape->Find(i);
- Check_Object(primitive);
- Stuff::Point3D *points;
- int vertex_count;
- primitive->GetCoordData(&points, &vertex_count);
- for (int v=0; v<vertex_count; ++v)
- {
- Stuff::Scalar len = points[v].GetLengthSquared();
- if (len > m_radius)
- m_radius = len;
- }
- }
- m_radius = Stuff::Sqrt(m_radius);
- }
- }
- //############################################################################
- //############################## gosFX::Shape ################################
- //############################################################################
- gosFX::Shape::ClassData*
- gosFX::Shape::DefaultData = NULL;
- //------------------------------------------------------------------------------
- //
- void
- gosFX::Shape::InitializeClass()
- {
- Verify(!DefaultData);
- Verify(gos_GetCurrentHeap() == Heap);
- DefaultData =
- new ClassData(
- ShapeClassID,
- "gosFX::Shape",
- Singleton::DefaultData,
- (Effect::Factory)&Make,
- (Specification::Factory)&Specification::Make
- );
- Register_Object(DefaultData);
- }
- //------------------------------------------------------------------------------
- //
- void
- gosFX::Shape::TerminateClass()
- {
- Unregister_Object(DefaultData);
- delete DefaultData;
- DefaultData = NULL;
- }
- //------------------------------------------------------------------------------
- //
- gosFX::Shape::Shape(
- Specification *spec,
- unsigned flags
- ):
- Singleton(DefaultData, spec, flags)
- {
- Verify(gos_GetCurrentHeap() == Heap);
- m_radius = spec->m_radius;
- }
- //------------------------------------------------------------------------------
- //
- gosFX::Shape*
- gosFX::Shape::Make(
- Specification *spec,
- unsigned flags
- )
- {
- Check_Object(spec);
- gos_PushCurrentHeap(Heap);
- Shape *cloud = new gosFX::Shape(spec, flags);
- gos_PopCurrentHeap();
- return cloud;
- }
- //------------------------------------------------------------------------------
- //
- void gosFX::Shape::Draw(DrawInfo *info)
- {
- Check_Object(this);
- Check_Object(info);
- Check_Object(info->m_parentToWorld);
- //
- //----------------------------
- // Set up the common draw info
- //----------------------------
- //
- MidLevelRenderer::DrawScalableShapeInformation dinfo;
- MidLevelRenderer::MLRShape *shape = GetSpecification()->m_shape;
- dinfo.clippingFlags.SetClippingState(0x3f);
- dinfo.worldToShape = NULL;
- Specification *spec = GetSpecification();
- Check_Object(spec);
- dinfo.state.Combine(info->m_state, spec->m_state);
- dinfo.activeLights = NULL;
- dinfo.nrOfActiveLights = 0;
- dinfo.shape = shape;
- Stuff::Vector3D scale(m_scale, m_scale, m_scale);
- dinfo.scaling = &scale;
- dinfo.paintMe = &m_color;
- Stuff::LinearMatrix4D local_to_world;
- local_to_world.Multiply(m_localToParent, *info->m_parentToWorld);
- dinfo.shapeToWorld = &local_to_world;
- //
- //--------------------------------------------------------------
- // Check the orientation mode. The first case is XY orientation
- //--------------------------------------------------------------
- //
- if (spec->m_alignZUsingX)
- {
- Stuff::Point3D
- camera_in_world(info->m_clipper->GetCameraToWorldMatrix());
- Stuff::Point3D card_in_world(local_to_world);
- Stuff::Vector3D look_at;
- look_at.Subtract(camera_in_world, card_in_world);
- if (spec->m_alignZUsingY)
- local_to_world.AlignLocalAxisToWorldVector(
- look_at,
- Stuff::Z_Axis,
- Stuff::Y_Axis,
- Stuff::X_Axis
- );
- else
- local_to_world.AlignLocalAxisToWorldVector(
- look_at,
- Stuff::Z_Axis,
- Stuff::X_Axis,
- -1
- );
- }
- //
- //-------------------------------------------------------
- // Each matrix needs to be aligned to the camera around Y
- //-------------------------------------------------------
- //
- else if (spec->m_alignZUsingY)
- {
- Stuff::Point3D
- camera_in_world(info->m_clipper->GetCameraToWorldMatrix());
- Stuff::Point3D card_in_world(local_to_world);
- Stuff::Vector3D look_at;
- look_at.Subtract(camera_in_world, card_in_world);
- local_to_world.AlignLocalAxisToWorldVector(
- look_at,
- Stuff::Z_Axis,
- Stuff::Y_Axis,
- -1
- );
- }
- //
- //----------------------------
- // Let our parent do its thing
- //----------------------------
- //
- info->m_clipper->DrawScalableShape(&dinfo);
- Singleton::Draw(info);
- }
- //------------------------------------------------------------------------------
- //
- void
- gosFX::Shape::TestInstance() const
- {
- Verify(IsDerivedFrom(DefaultData));
- }
|