Browse Source

added spatial and node2d helper methods

to perform operations such as translaiton, rotation, etc directly on
nodes.
Juan Linietsky 10 years ago
parent
commit
a93e33f5c8
8 changed files with 166 additions and 43 deletions
  1. 5 5
      scene/2d/light_2d.cpp
  2. 1 1
      scene/2d/light_2d.h
  3. 34 15
      scene/2d/node_2d.cpp
  4. 6 2
      scene/2d/node_2d.h
  5. 0 18
      scene/3d/camera.cpp
  6. 0 2
      scene/3d/camera.h
  7. 106 0
      scene/3d/spatial.cpp
  8. 14 0
      scene/3d/spatial.h

+ 5 - 5
scene/2d/light_2d.cpp

@@ -23,7 +23,7 @@ Rect2 Light2D::get_item_rect() const {
 
 	Size2i s;
 
-	s = texture->get_size()*scale;
+	s = texture->get_size()*_scale;
 	Point2i ofs=texture_offset;
 	ofs-=s/2;
 
@@ -98,8 +98,8 @@ float Light2D::get_height() const {
 
 void Light2D::set_scale( float p_scale) {
 
-	scale=p_scale;
-	VS::get_singleton()->canvas_light_set_scale(canvas_light,scale);
+	_scale=p_scale;
+	VS::get_singleton()->canvas_light_set_scale(canvas_light,_scale);
 	item_rect_changed();
 
 }
@@ -107,7 +107,7 @@ void Light2D::set_scale( float p_scale) {
 
 float Light2D::get_scale() const {
 
-	return scale;
+	return _scale;
 }
 
 void Light2D::set_z_range_min( int p_min_z) {
@@ -322,7 +322,7 @@ Light2D::Light2D() {
 	shadow=false;
 	color=Color(1,1,1);
 	height=0;
-	scale=1.0;
+	_scale=1.0;
 	z_min=-1024;
 	z_max=1024;
 	layer_min=0;

+ 1 - 1
scene/2d/light_2d.h

@@ -12,7 +12,7 @@ private:
 	bool shadow;
 	Color color;
 	float height;
-	float scale;
+	float _scale;
 	int z_min;
 	int z_max;
 	int layer_min;

+ 34 - 15
scene/2d/node_2d.cpp

@@ -65,7 +65,7 @@ void Node2D::edit_set_state(const Variant& p_state) {
 
 	pos = state[0];
 	angle = state[1];
-	scale = state[2];
+	_scale = state[2];
 	_update_transform();
 	_change_notify("transform/rot");
 	_change_notify("transform/scale");
@@ -93,11 +93,11 @@ void Node2D::edit_set_rect(const Rect2& p_edit_rect) {
 	Point2 new_pos = p_edit_rect.pos + p_edit_rect.size*zero_offset;//p_edit_rect.pos - r.pos;
 
 	Matrix32 postxf;
-	postxf.set_rotation_and_scale(angle,scale);
+	postxf.set_rotation_and_scale(angle,_scale);
 	new_pos = postxf.xform(new_pos);
 
 	pos+=new_pos;
-	scale*=new_scale;
+	_scale*=new_scale;
 
 	_update_transform();
 	_change_notify("transform/scale");
@@ -118,14 +118,14 @@ void Node2D::_update_xform_values() {
 
 	pos=_mat.elements[2];
 	angle=_mat.get_rotation();
-	scale=_mat.get_scale();
+	_scale=_mat.get_scale();
 	_xform_dirty=false;
 }
 
 void Node2D::_update_transform() {
 
 	Matrix32 mat(angle,pos);
-	_mat.set_rotation_and_scale(angle,scale);
+	_mat.set_rotation_and_scale(angle,_scale);
 	_mat.elements[2]=pos;
 
 	VisualServer::get_singleton()->canvas_item_set_transform(get_canvas_item(),_mat);
@@ -161,11 +161,11 @@ void Node2D::set_scale(const Size2& p_scale) {
 
 	if (_xform_dirty)
 		((Node2D*)this)->_update_xform_values();
-	scale=p_scale;
-	if (scale.x==0)
-		scale.x=CMP_EPSILON;
-	if (scale.y==0)
-		scale.y=CMP_EPSILON;
+	_scale=p_scale;
+	if (_scale.x==0)
+		_scale.x=CMP_EPSILON;
+	if (_scale.y==0)
+		_scale.y=CMP_EPSILON;
 	_update_transform();
 	_change_notify("transform/scale");
 
@@ -187,7 +187,7 @@ Size2 Node2D::get_scale() const {
 	if (_xform_dirty)
 		((Node2D*)this)->_update_xform_values();
 
-	return scale;
+	return _scale;
 }
 
 void Node2D::_set_rotd(float p_angle) {
@@ -224,11 +224,27 @@ Rect2 Node2D::get_item_rect() const {
 	return Rect2(Point2(-32,-32),Size2(64,64));
 }
 
-void Node2D::rotate(float p_degrees) {
+void Node2D::rotate(float p_radians) {
 
-	set_rot( get_rot() + p_degrees);
+	set_rot( get_rot() + p_radians);
 }
 
+void Node2D::translate(const Vector2& p_amount) {
+
+	set_pos( get_pos() + p_amount );
+}
+
+void Node2D::global_translate(const Vector2& p_amount) {
+
+	set_global_pos( get_global_pos() + p_amount );
+}
+
+void Node2D::scale(const Vector2& p_amount) {
+
+	set_scale( get_scale() * p_amount );
+}
+
+
 void Node2D::move_x(float p_delta,bool p_scaled){
 
 	Matrix32 t = get_transform();
@@ -345,9 +361,12 @@ void Node2D::_bind_methods() {
 	ObjectTypeDB::bind_method(_MD("get_rot"),&Node2D::get_rot);
 	ObjectTypeDB::bind_method(_MD("get_scale"),&Node2D::get_scale);
 
-	ObjectTypeDB::bind_method(_MD("rotate","degrees"),&Node2D::rotate);
+	ObjectTypeDB::bind_method(_MD("rotate","radians"),&Node2D::rotate);
 	ObjectTypeDB::bind_method(_MD("move_local_x","delta","scaled"),&Node2D::move_x,DEFVAL(false));
 	ObjectTypeDB::bind_method(_MD("move_local_y","delta","scaled"),&Node2D::move_y,DEFVAL(false));
+	ObjectTypeDB::bind_method(_MD("translate","offset"),&Node2D::translate);
+	ObjectTypeDB::bind_method(_MD("global_translate","offset"),&Node2D::global_translate);
+	ObjectTypeDB::bind_method(_MD("scale","ratio"),&Node2D::scale);
 
 	ObjectTypeDB::bind_method(_MD("set_global_pos","pos"),&Node2D::set_global_pos);
 	ObjectTypeDB::bind_method(_MD("get_global_pos"),&Node2D::get_global_pos);
@@ -379,7 +398,7 @@ Node2D::Node2D() {
 
 
 	angle=0;
-	scale=Vector2(1,1);
+	_scale=Vector2(1,1);
 	_xform_dirty=false;
 	z=0;
 	z_relative=true;

+ 6 - 2
scene/2d/node_2d.h

@@ -37,7 +37,7 @@ class Node2D : public CanvasItem {
 
 	Point2 pos;
 	float angle;
-	Size2 scale;
+	Size2 _scale;
 	int z;
 	bool z_relative;
 
@@ -72,9 +72,12 @@ public:
 	void set_rot(float p_angle);
 	void set_scale(const Size2& p_scale);
 
-	void rotate(float p_degrees);
+	void rotate(float p_radians);
 	void move_x(float p_delta,bool p_scaled=false);
 	void move_y(float p_delta,bool p_scaled=false);
+	void translate(const Vector2& p_amount);
+	void global_translate(const Vector2& p_amount);
+	void scale(const Vector2& p_amount);
 
 	Point2 get_pos() const;
 	float get_rot() const;
@@ -96,6 +99,7 @@ public:
 	Matrix32 get_relative_transform(const Node *p_parent) const;
 
 
+
 	Matrix32 get_transform() const;
 
 	Node2D();

+ 0 - 18
scene/3d/camera.cpp

@@ -680,8 +680,6 @@ void Camera::_bind_methods() {
 	ObjectTypeDB::bind_method( _MD("get_projection"),&Camera::get_projection );
 	ObjectTypeDB::bind_method( _MD("set_visible_layers","mask"),&Camera::set_visible_layers );
 	ObjectTypeDB::bind_method( _MD("get_visible_layers"),&Camera::get_visible_layers );
-	ObjectTypeDB::bind_method( _MD("look_at","target","up"),&Camera::look_at );
-	ObjectTypeDB::bind_method( _MD("look_at_from_pos","pos","target","up"),&Camera::look_at_from_pos );
 	ObjectTypeDB::bind_method(_MD("set_environment","env:Environment"),&Camera::set_environment);
 	ObjectTypeDB::bind_method(_MD("get_environment:Environment"),&Camera::get_environment);
 	ObjectTypeDB::bind_method(_MD("set_keep_aspect_mode","mode"),&Camera::set_keep_aspect_mode);
@@ -752,22 +750,6 @@ Vector<Plane> Camera::get_frustum() const {
 
 
 
-void Camera::look_at(const Vector3& p_target, const Vector3& p_up_normal) {
-
-	Transform lookat;
-	lookat.origin=get_camera_transform().origin;
-	lookat=lookat.looking_at(p_target,p_up_normal);
-	set_global_transform(lookat);
-}
-
-void Camera::look_at_from_pos(const Vector3& p_pos,const Vector3& p_target, const Vector3& p_up_normal) {
-
-	Transform lookat;
-	lookat.origin=p_pos;
-	lookat=lookat.looking_at(p_target,p_up_normal);
-	set_global_transform(lookat);
-
-}
 
 void Camera::set_v_offset(float p_offset) {
 

+ 0 - 2
scene/3d/camera.h

@@ -139,8 +139,6 @@ public:
 	void set_keep_aspect_mode(KeepAspect p_aspect);
 	KeepAspect get_keep_aspect_mode() const;
 
-	void look_at(const Vector3& p_target, const Vector3& p_up_normal);
-	void look_at_from_pos(const Vector3& p_pos,const Vector3& p_target, const Vector3& p_up_normal);
 
 	void set_v_offset(float p_offset);
 	float get_v_offset() const;

+ 106 - 0
scene/3d/spatial.cpp

@@ -593,6 +593,91 @@ bool Spatial::_is_visible_() const {
 	return !is_hidden();
 }
 
+void Spatial::rotate(const Vector3& p_normal,float p_radians) {
+
+	Transform t =get_transform();
+	t.basis.rotate(p_normal,p_radians);
+	set_transform(t);
+}
+
+void Spatial::rotate_x(float p_radians) {
+
+	Transform t =get_transform();
+	t.basis.rotate(Vector3(1,0,0),p_radians);
+	set_transform(t);
+
+}
+
+void Spatial::rotate_y(float p_radians){
+
+	Transform t =get_transform();
+	t.basis.rotate(Vector3(0,1,0),p_radians);
+	set_transform(t);
+
+}
+void Spatial::rotate_z(float p_radians){
+
+	Transform t =get_transform();
+	t.basis.rotate(Vector3(0,0,1),p_radians);
+	set_transform(t);
+
+}
+
+void Spatial::translate(const Vector3& p_offset){
+
+	Transform t =get_transform();
+	t.origin+=p_offset;
+	set_transform(t);
+
+}
+void Spatial::scale(const Vector3& p_ratio){
+
+	Transform t =get_transform();
+	t.basis.scale(p_ratio);
+	set_transform(t);
+
+}
+void Spatial::global_rotate(const Vector3& p_normal,float p_radians){
+
+	Matrix3 rotation(p_normal,p_radians);
+	Transform t = get_global_transform();
+	t.basis= rotation * t.basis;
+	set_global_transform(t);
+
+}
+void Spatial::global_translate(const Vector3& p_offset){
+	Transform t = get_global_transform();
+	t.origin+=p_offset;
+	set_global_transform(t);
+
+}
+
+void Spatial::orthonormalize() {
+
+	Transform t = get_transform();
+	t.orthonormalize();
+	set_transform(t);
+
+}
+
+
+void Spatial::look_at(const Vector3& p_target, const Vector3& p_up_normal) {
+
+	Transform lookat;
+	lookat.origin=get_global_transform().origin;
+	lookat=lookat.looking_at(p_target,p_up_normal);
+	set_global_transform(lookat);
+}
+
+void Spatial::look_at_from_pos(const Vector3& p_pos,const Vector3& p_target, const Vector3& p_up_normal) {
+
+	Transform lookat;
+	lookat.origin=p_pos;
+	lookat=lookat.looking_at(p_target,p_up_normal);
+	set_global_transform(lookat);
+
+}
+
 
 void Spatial::_bind_methods() {
 
@@ -633,6 +718,27 @@ void Spatial::_bind_methods() {
 	ObjectTypeDB::bind_method(_MD("_set_visible_"), &Spatial::_set_visible_);
 	ObjectTypeDB::bind_method(_MD("_is_visible_"), &Spatial::_is_visible_);
 
+	void rotate(const Vector3& p_normal,float p_radians);
+	void rotate_x(float p_radians);
+	void rotate_y(float p_radians);
+	void rotate_z(float p_radians);
+	void translate(const Vector3& p_offset);
+	void scale(const Vector3& p_ratio);
+	void global_rotate(const Vector3& p_normal,float p_radians);
+	void global_translate(const Vector3& p_offset);
+
+	ObjectTypeDB::bind_method( _MD("rotate","normal","radians"),&Spatial::rotate );
+	ObjectTypeDB::bind_method( _MD("global_rotate","normal","radians"),&Spatial::global_rotate );
+	ObjectTypeDB::bind_method( _MD("rotate_x","radians"),&Spatial::rotate_x );
+	ObjectTypeDB::bind_method( _MD("rotate_y","radians"),&Spatial::rotate_y );
+	ObjectTypeDB::bind_method( _MD("rotate_z","radians"),&Spatial::rotate_z );
+	ObjectTypeDB::bind_method( _MD("translate","offset"),&Spatial::translate );
+	ObjectTypeDB::bind_method( _MD("global_translate","offset"),&Spatial::global_translate );
+	ObjectTypeDB::bind_method( _MD("orthonormalize"),&Spatial::orthonormalize );
+
+	ObjectTypeDB::bind_method( _MD("look_at","target","up"),&Spatial::look_at );
+	ObjectTypeDB::bind_method( _MD("look_at_from_pos","pos","target","up"),&Spatial::look_at_from_pos );
+
 	BIND_CONSTANT( NOTIFICATION_TRANSFORM_CHANGED );
 	BIND_CONSTANT( NOTIFICATION_ENTER_WORLD );
 	BIND_CONSTANT( NOTIFICATION_EXIT_WORLD );

+ 14 - 0
scene/3d/spatial.h

@@ -167,6 +167,20 @@ public:
 
 	Transform get_relative_transform(const Node *p_parent) const;
 
+	void rotate(const Vector3& p_normal,float p_radians);
+	void rotate_x(float p_radians);
+	void rotate_y(float p_radians);
+	void rotate_z(float p_radians);
+	void translate(const Vector3& p_offset);
+	void scale(const Vector3& p_ratio);
+	void global_rotate(const Vector3& p_normal,float p_radians);
+	void global_translate(const Vector3& p_offset);
+
+	void look_at(const Vector3& p_target, const Vector3& p_up_normal);
+	void look_at_from_pos(const Vector3& p_pos,const Vector3& p_target, const Vector3& p_up_normal);
+
+	void orthonormalize();
+
 	void show();
 	void hide();
 	bool is_visible() const;