]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - plugins/entity/scale.h
my own uncrustify run
[xonotic/netradiant.git] / plugins / entity / scale.h
1 /*
2    Copyright (C) 2001-2006, William Joseph.
3    All Rights Reserved.
4
5    This file is part of GtkRadiant.
6
7    GtkRadiant is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    GtkRadiant is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GtkRadiant; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21
22 #if !defined( INCLUDED_SCALE_H )
23 #define INCLUDED_SCALE_H
24
25 #include "ientity.h"
26
27 #include "math/matrix.h"
28 #include "generic/callback.h"
29 #include "stringio.h"
30
31 const Vector3 SCALEKEY_IDENTITY = Vector3( 1, 1, 1 );
32
33 inline void default_scale( Vector3& scale ){
34         scale = SCALEKEY_IDENTITY;
35 }
36 inline void read_scale( Vector3& scalevec, const char* value ){
37         float scale;
38         if ( !string_parse_float( value, scale )
39                  || scale == 0 ) {
40                 default_scale( scalevec );
41         }
42         else
43         {
44                 scalevec = Vector3( scale, scale, scale );
45         }
46 }
47 inline void read_scalevec( Vector3& scale, const char* value ){
48         if ( !string_parse_vector3( value, scale )
49                  || scale[0] == 0
50                  || scale[1] == 0
51                  || scale[2] == 0 ) {
52                 default_scale( scale );
53         }
54 }
55 inline void write_scale( const Vector3& scale, Entity* entity ){
56         if ( scale[0] == 1 && scale[1] == 1 && scale[2] == 1 ) {
57                 entity->setKeyValue( "modelscale", "" );
58                 entity->setKeyValue( "modelscale_vec", "" );
59         }
60         else
61         {
62                 char value[64];
63
64                 if ( scale[0] == scale[1] && scale[0] == scale[2] ) {
65                         sprintf( value, "%f", scale[0] );
66                         entity->setKeyValue( "modelscale_vec", "" );
67                         entity->setKeyValue( "modelscale", value );
68                 }
69                 else
70                 {
71                         sprintf( value, "%f %f %f", scale[0], scale[1], scale[2] );
72                         entity->setKeyValue( "modelscale", "" );
73                         entity->setKeyValue( "modelscale_vec", value );
74                 }
75         }
76 }
77
78 inline Vector3 scale_scaled( const Vector3& scale, const Vector3& scaling ){
79         return matrix4_get_scale_vec3(
80                            matrix4_multiplied_by_matrix4(
81                                    matrix4_scale_for_vec3( scale ),
82                                    matrix4_scale_for_vec3( scaling )
83                                    )
84                            );
85 }
86
87
88 class ScaleKey
89 {
90 Callback m_scaleChanged;
91 public:
92 Vector3 m_scale;
93
94
95 ScaleKey( const Callback& scaleChanged )
96         : m_scaleChanged( scaleChanged ), m_scale( SCALEKEY_IDENTITY ){
97 }
98
99 void uniformScaleChanged( const char* value ){
100         read_scale( m_scale, value );
101         m_scaleChanged();
102 }
103 typedef MemberCaller1<ScaleKey, const char*, &ScaleKey::uniformScaleChanged> UniformScaleChangedCaller;
104
105 void scaleChanged( const char* value ){
106         read_scalevec( m_scale, value );
107         m_scaleChanged();
108 }
109 typedef MemberCaller1<ScaleKey, const char*, &ScaleKey::scaleChanged> ScaleChangedCaller;
110
111 void write( Entity* entity ) const {
112         write_scale( m_scale, entity );
113 }
114 };
115
116
117 #endif