Revision: 6787
http://playerstage.svn.sourceforge.net/playerstage/?rev=6787&view=rev
Author: jeremy_asher
Date: 2008-07-07 14:18:14 -0700 (Mon, 07 Jul 2008)
Log Message:
-----------
Fixed crash on loading empty worldfile, Added loading/saving of perspective
camera (example in fasr.world)
Modified Paths:
--------------
code/stage/trunk/libstage/camera.cc
code/stage/trunk/libstage/canvas.cc
code/stage/trunk/libstage/model.cc
code/stage/trunk/libstage/stage.hh
code/stage/trunk/libstage/worldgui.cc
code/stage/trunk/worlds/fasr.world
Modified: code/stage/trunk/libstage/camera.cc
===================================================================
--- code/stage/trunk/libstage/camera.cc 2008-07-07 20:36:07 UTC (rev 6786)
+++ code/stage/trunk/libstage/camera.cc 2008-07-07 21:18:14 UTC (rev 6787)
@@ -11,12 +11,14 @@
#include <iostream>
-//perspective camera
-//perspective camera
+// Perspective Camera
StgPerspectiveCamera::StgPerspectiveCamera( void ) :
- _z_near( 0.2 ), _z_far( 40.0 ), _vert_fov( 40 ), _horiz_fov( 60
), _aspect( 1.0 )
+ StgCamera(),
+ _z_near( 0.2 ), _z_far( 40.0 ),
+ _vert_fov( 70 ), _horiz_fov( 70 ),
+ _aspect( 1.0 )
{
- setYaw( 90 );
+ setPitch( 70.0 );
}
void StgPerspectiveCamera::move( float x, float y, float z )
@@ -84,7 +86,22 @@
_y += cos( dtor( _yaw ) ) * amount;
}
+void StgPerspectiveCamera::Load( Worldfile* wf, int sec ) {
+ float x = wf->ReadTupleFloat(sec, "pcam_loc", 0, 0 );
+ float y = wf->ReadTupleFloat(sec, "pcam_loc", 1, 0 );
+ float z = wf->ReadTupleFloat(sec, "pcam_loc", 2, 0 );
+ setPose( x, y, z );
+ setPitch( wf->ReadTupleFloat( sec, "pcam_angle", 0, 0 ) );
+ setYaw( wf->ReadTupleFloat( sec, "pcam_angle", 1, 0 ) );
+}
+void StgPerspectiveCamera::Save( Worldfile* wf, int sec ) {
+ wf->WriteTupleFloat( sec, "pcam_loc", 0, x() );
+ wf->WriteTupleFloat( sec, "pcam_loc", 1, y() );
+ wf->WriteTupleFloat( sec, "pcam_loc", 2, z() );
+ wf->WriteTupleFloat( sec, "pcam_angle", 0, pitch() );
+ wf->WriteTupleFloat( sec, "pcam_angle", 1, yaw() );
+}
@@ -126,6 +143,28 @@
SetProjection();
}
+void StgOrthoCamera::move( float x, float y ) {
+ //convert screen points into world points
+ x = x / ( _scale );
+ y = y / ( _scale );
+
+ //adjust for pitch angle
+ y = y / cos( dtor( _pitch ) );
+
+ //don't allow huge values
+ if( y > 100 )
+ y = 100;
+ else if( y < -100 )
+ y = -100;
+
+ //adjust for yaw angle
+ _x += cos( dtor( _yaw ) ) * x;
+ _y += -sin( dtor( _yaw ) ) * x;
+
+ _x += sin( dtor( _yaw ) ) * y;
+ _y += cos( dtor( _yaw ) ) * y;
+}
+
//TODO re-evaluate the way the camera is shifted when the mouse zooms - it
might be possible to simplify
void StgOrthoCamera::scale( float scale, float shift_x, float w, float
shift_y, float h )
{
@@ -165,3 +204,21 @@
}
}
}
+
+void StgOrthoCamera::Load( Worldfile* wf, int sec ) {
+ float x = wf->ReadTupleFloat(sec, "center", 0, 0 );
+ float y = wf->ReadTupleFloat(sec, "center", 1, 0 );
+ setPose( x, y );
+ setPitch( wf->ReadTupleFloat( sec, "rotate", 0, 0 ) );
+ setYaw( wf->ReadTupleFloat( sec, "rotate", 1, 0 ) );
+ setScale( wf->ReadFloat(sec, "scale", scale() ) );
+}
+
+void StgOrthoCamera::Save( Worldfile* wf, int sec ) {
+ wf->WriteTupleFloat( sec, "center", 0, x() );
+ wf->WriteTupleFloat( sec, "center", 1, y() );
+ wf->WriteTupleFloat( sec, "rotate", 0, pitch() );
+ wf->WriteTupleFloat( sec, "rotate", 1, yaw() );
+ wf->WriteFloat(sec, "scale", scale() );
+}
+
Modified: code/stage/trunk/libstage/canvas.cc
===================================================================
--- code/stage/trunk/libstage/canvas.cc 2008-07-07 20:36:07 UTC (rev 6786)
+++ code/stage/trunk/libstage/canvas.cc 2008-07-07 21:18:14 UTC (rev 6787)
@@ -65,8 +65,7 @@
selected_models = NULL;
last_selection = NULL;
- perspective_camera.setPose( -3.0, 0.0, 1.0 );
- perspective_camera.setPitch( 70.0 ); //look down
+ perspective_camera.setPose( 0.0, -4.0, 3.0 );
current_camera = &camera;
setDirtyBuffer();
@@ -266,8 +265,8 @@
perspective_camera.addPitch( -dy );
}
else {
- camera.pitch( 0.5 * static_cast<double>( dy ) );
- camera.yaw( 0.5 * static_cast<double>( dx ) );
+ camera.setPitch( 0.5 * static_cast<double>( dy
) );
+ camera.setYaw( 0.5 * static_cast<double>( dx )
);
}
invalidate();
redraw();
@@ -556,9 +555,9 @@
void StgCanvas::renderFrame()
{
//before drawing, order all models based on distance from camera
- float x = camera.getX();
- float y = camera.getY();
- float sphi = dtor( camera.getYaw() );
+ float x = camera.x();
+ float y = camera.y();
+ float sphi = dtor( camera.yaw() );
//estimate point of camera location - hard to do with orthogonal mode
x += -sin( sphi ) * 100;
@@ -681,7 +680,7 @@
glPushMatrix();
for( std::multimap< float, StgModel* >::reverse_iterator i =
ordered.rbegin(); i != ordered.rend(); i++ ) {
//ensure two icons can't be in the exact same plane
- if( camera.getPitch() == 0 )
+ if( camera.pitch() == 0 )
glTranslatef( 0, 0, 0.1 );
i->second->DrawStatusTree( this );
}
@@ -846,14 +845,9 @@
void StgCanvas::Load( Worldfile* wf, int sec )
{
- float x = wf->ReadTupleFloat(sec, "center", 0, 0 );
- float y = wf->ReadTupleFloat(sec, "center", 1, 0 );
- camera.setPose( x, y );
-
- camera.setPitch( wf->ReadTupleFloat( sec, "rotate", 0, 0 ) );
- camera.setYaw( wf->ReadTupleFloat( sec, "rotate", 1, 0 ) );
-
- camera.setScale( wf->ReadFloat(sec, "scale", camera.getScale() ) );
+ camera.Load( wf, sec );
+ perspective_camera.Load( wf, sec );
+
interval = wf->ReadInt(sec, "interval", interval );
showData.Load( wf, sec );
@@ -875,15 +869,9 @@
void StgCanvas::Save( Worldfile* wf, int sec )
{
- wf->WriteFloat( sec, "scale", camera.getScale() );
-
- wf->WriteTupleFloat( sec, "center", 0, camera.getX() );
- wf->WriteTupleFloat( sec, "center", 1, camera.getY() );
-
- wf->WriteTupleFloat( sec, "rotate", 0, camera.getPitch() );
- wf->WriteTupleFloat( sec, "rotate", 1, camera.getYaw() );
-
- wf->WriteFloat(sec, "scale", camera.getScale() );
+ camera.Save( wf, sec );
+ perspective_camera.Save( wf, sec );
+
wf->WriteInt(sec, "interval", interval );
showData.Save( wf, sec );
Modified: code/stage/trunk/libstage/model.cc
===================================================================
--- code/stage/trunk/libstage/model.cc 2008-07-07 20:36:07 UTC (rev 6786)
+++ code/stage/trunk/libstage/model.cc 2008-07-07 21:18:14 UTC (rev 6787)
@@ -961,7 +961,7 @@
else {
pitch = canvas->current_camera->pitch();
yaw = canvas->current_camera->yaw();
- scale = canvas->camera.getScale();
+ scale = canvas->camera.scale();
}
float robotAngle = -rtod(pose.a);
Modified: code/stage/trunk/libstage/stage.hh
===================================================================
--- code/stage/trunk/libstage/stage.hh 2008-07-07 20:36:07 UTC (rev 6786)
+++ code/stage/trunk/libstage/stage.hh 2008-07-07 21:18:14 UTC (rev 6787)
@@ -1805,7 +1805,6 @@
class StgPerspectiveCamera : public StgCamera
{
private:
-
float _z_near;
float _z_far;
float _vert_fov;
@@ -1849,6 +1848,9 @@
inline float nearClip( void ) const { return _z_near; }
inline float farClip( void ) const { return _z_far; }
inline void setClip( float near, float far ) { _z_far = far;
_z_near = near; }
+
+ void Load( Worldfile* wf, int sec );
+ void Save( Worldfile* wf, int sec );
};
class StgOrthoCamera : public StgCamera
@@ -1867,33 +1869,9 @@
virtual void SetProjection( float pixels_width, float
pixels_height, float y_min, float y_max );
virtual void SetProjection( void ) const;
- inline void move( float x, float y ) {
- //convert screen points into world points
- x = x / ( _scale );
- y = y / ( _scale );
-
- //adjust for pitch angle
- y = y / cos( dtor( _pitch ) );
-
- //don't allow huge values
- if( y > 100 )
- y = 100;
- else if( y < -100 )
- y = -100;
-
- //adjust for yaw angle
- _x += cos( dtor( _yaw ) ) * x;
- _y += -sin( dtor( _yaw ) ) * x;
-
- _x += sin( dtor( _yaw ) ) * y;
- _y += cos( dtor( _yaw ) ) * y;
- }
-
- inline void yaw( float yaw ) {
- _yaw += yaw;
- }
-
- inline void pitch( float pitch ) {
+ void move( float x, float y );
+ inline void setYaw( float yaw ) { _yaw += yaw; }
+ inline void setPitch( float pitch ) {
_pitch += pitch;
if( _pitch < -90 )
_pitch = -90;
@@ -1901,22 +1879,16 @@
_pitch = 0;
}
- inline float getYaw( void ) const { return _yaw; }
- inline float getPitch( void ) const { return _pitch; }
-
- inline void setYaw( float yaw ) { _yaw = yaw; }
- inline void setPitch( float pitch ) { _pitch = pitch; }
inline void setScale( float scale ) { _scale = scale; }
inline void setPose( float x, float y) { _x = x; _y = y; }
-
-
void scale( float scale, float shift_x = 0, float h = 0, float
shift_y = 0, float w = 0 );
inline void resetAngle( void ) { _pitch = _yaw = 0; }
- inline float getScale() const { return _scale; }
- inline float getX() const { return _x; }
- inline float getY() const { return _y; }
+ inline float scale() const { return _scale; }
+
+ void Load( Worldfile* wf, int sec );
+ void Save( Worldfile* wf, int sec );
};
Modified: code/stage/trunk/libstage/worldgui.cc
===================================================================
--- code/stage/trunk/libstage/worldgui.cc 2008-07-07 20:36:07 UTC (rev
6786)
+++ code/stage/trunk/libstage/worldgui.cc 2008-07-07 21:18:14 UTC (rev
6787)
@@ -141,7 +141,8 @@
// improve the title bar to say "Stage: <worldfile name>"
std::string title = PROJECT;
title += ": ";
- title += L;
+ if ( L )
+ title += L;
label( title.c_str() );
interval_real = (stg_usec_t)thousand * DEFAULT_INTERVAL_REAL;
Modified: code/stage/trunk/worlds/fasr.world
===================================================================
--- code/stage/trunk/worlds/fasr.world 2008-07-07 20:36:07 UTC (rev 6786)
+++ code/stage/trunk/worlds/fasr.world 2008-07-07 21:18:14 UTC (rev 6787)
@@ -22,9 +22,13 @@
window
(
size [ 601.000 605.000 ]
+
center [ 0 0 ]
rotate [ 0 0 ]
scale 32.344
+
+ pcam_loc [ 0 -4 2 ]
+ pcam_angle [ 70.000 0 ]
show_data 0
show_flags 1
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
Sponsored by: SourceForge.net Community Choice Awards: VOTE NOW!
Studies have shown that voting for your favorite open source project,
along with a healthy diet, reduces your potential for chronic lameness
and boredom. Vote Now at http://www.sourceforge.net/community/cca08
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit