/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined( INCLUDED_ORIGIN_H ) #define INCLUDED_ORIGIN_H #include "ientity.h" #include "math/matrix.h" #include "generic/callback.h" #include "stringio.h" const Vector3 ORIGINKEY_IDENTITY = Vector3( 0, 0, 0 ); inline void default_origin( Vector3& origin ){ origin = ORIGINKEY_IDENTITY; } inline void read_origin( Vector3& origin, const char* value ){ if ( !string_parse_vector3( value, origin ) ) { default_origin( origin ); } } inline void write_origin( const Vector3& origin, Entity* entity, const char* key ){ char value[64]; sprintf( value, "%f %f %f", origin[0], origin[1], origin[2] ); entity->setKeyValue( key, value ); } inline Vector3 origin_translated( const Vector3& origin, const Vector3& translation ){ return matrix4_get_translation_vec3( matrix4_multiplied_by_matrix4( matrix4_translation_for_vec3( origin ), matrix4_translation_for_vec3( translation ) ) ); } inline Vector3 origin_snapped( const Vector3& origin, float snap ){ return vector3_snapped( origin, snap ); } class OriginKey { Callback m_originChanged; public: Vector3 m_origin; OriginKey( const Callback& originChanged ) : m_originChanged( originChanged ), m_origin( ORIGINKEY_IDENTITY ){ } void originChanged( const char* value ){ read_origin( m_origin, value ); m_originChanged(); } typedef MemberCaller1 OriginChangedCaller; void write( Entity* entity ) const { write_origin( m_origin, entity, "origin" ); } }; #include "scenelib.h" inline BrushDoom3* Node_getBrushDoom3( scene::Node& node ){ return NodeTypeCast::cast( node ); } inline void BrushDoom3_setDoom3GroupOrigin( scene::Node& node, const Vector3& origin ){ BrushDoom3* brush = Node_getBrushDoom3( node ); if ( brush != 0 ) { brush->setDoom3GroupOrigin( origin ); } } class SetDoom3GroupOriginWalker : public scene::Traversable::Walker { const Vector3& m_origin; public: SetDoom3GroupOriginWalker( const Vector3& origin ) : m_origin( origin ){ } bool pre( scene::Node& node ) const { BrushDoom3_setDoom3GroupOrigin( node, m_origin ); return true; } }; class Doom3GroupOrigin : public scene::Traversable::Observer { scene::Traversable& m_set; const Vector3& m_origin; bool m_enabled; public: Doom3GroupOrigin( scene::Traversable& set, const Vector3& origin ) : m_set( set ), m_origin( origin ), m_enabled( false ){ } void enable(){ m_enabled = true; originChanged(); } void disable(){ m_enabled = false; } void originChanged(){ if ( m_enabled ) { m_set.traverse( SetDoom3GroupOriginWalker( m_origin ) ); } } void insert( scene::Node& node ){ if ( m_enabled ) { BrushDoom3_setDoom3GroupOrigin( node, m_origin ); } } void erase( scene::Node& node ){ if ( m_enabled ) { BrushDoom3_setDoom3GroupOrigin( node, Vector3( 0, 0, 0 ) ); } } }; #endif