Revision: 6685
http://playerstage.svn.sourceforge.net/playerstage/?rev=6685&view=rev
Author: alexcb
Date: 2008-06-25 13:09:36 -0700 (Wed, 25 Jun 2008)
Log Message:
-----------
camera model visualization optimizations and removed some unused variables
Modified Paths:
--------------
code/stage/trunk/libstage/canvas.cc
code/stage/trunk/libstage/model_camera.cc
code/stage/trunk/libstage/stage.hh
Modified: code/stage/trunk/libstage/canvas.cc
===================================================================
--- code/stage/trunk/libstage/canvas.cc 2008-06-25 19:21:46 UTC (rev 6684)
+++ code/stage/trunk/libstage/canvas.cc 2008-06-25 20:09:36 UTC (rev 6685)
@@ -447,12 +447,13 @@
void StgCanvas::DrawFloor()
{
stg_bounds3d_t bounds = world->GetExtent();
+ float z = 0;
glColor3f( 0.6, 0.6, 1.0 );
glBegin(GL_QUADS);
- glVertex3f( bounds.x.min, bounds.y.min, 0 );
- glVertex3f( bounds.x.max, bounds.y.min, 0 );
- glVertex3f( bounds.x.max, bounds.y.max, 0 );
- glVertex3f( bounds.x.min, bounds.y.max, 0 );
+ glVertex3f( bounds.x.min, bounds.y.min, z );
+ glVertex3f( bounds.x.max, bounds.y.min, z );
+ glVertex3f( bounds.x.max, bounds.y.max, z );
+ glVertex3f( bounds.x.min, bounds.y.max, z );
glEnd();
glEnd();
@@ -720,7 +721,7 @@
//create floor texture
{
//TODO merge this code into the textureManager
- int i, j, c;
+ int i, j;
for (i = 0; i < checkImageHeight; i++)
for (j = 0; j < checkImageWidth; j++)
{
Modified: code/stage/trunk/libstage/model_camera.cc
===================================================================
--- code/stage/trunk/libstage/model_camera.cc 2008-06-25 19:21:46 UTC (rev
6684)
+++ code/stage/trunk/libstage/model_camera.cc 2008-06-25 20:09:36 UTC (rev
6685)
@@ -32,8 +32,19 @@
StgModelCamera::StgModelCamera( StgWorld* world, StgModel* parent )
: StgModel( world, parent, MODEL_TYPE_CAMERA ),
-_frame_data( NULL ), _frame_color_data( NULL ),
-_vertexbuf_scaled( NULL ), _width( 0 ), _height( 0 ), _valid_vertexbuf_cache(
false ), _yaw_offset( 0 )
+_canvas( NULL ),
+_frame_data( NULL ),
+_frame_color_data( NULL ),
+_valid_vertexbuf_cache( false ),
+_vertexbuf_cache( NULL ),
+_width( 0 ),
+_height( 0 ),
+_camera_quads_size( 0 ),
+_camera_quads( NULL ),
+_camera_colors( NULL ),
+_camera(),
+_yaw_offset( 0 )
+
{
PRINT_DEBUG2( "Constructing StgModelCamera %d (%s)\n",
id, typestr );
@@ -62,11 +73,12 @@
StgModelCamera::~StgModelCamera()
{
if( _frame_data != NULL ) {
+ //dont forget about GetFrame() //TODO merge these together
delete[] _frame_data;
delete[] _frame_color_data;
delete[] _vertexbuf_cache;
- delete[] _vertexbuf_scaled;
- delete[] _vertexbuf_scaled_index;
+ delete[] _camera_quads;
+ delete[] _camera_colors;
}
}
@@ -101,18 +113,21 @@
if( _frame_data == NULL ) {
if( _frame_data != NULL ) {
+ //don't forget about destructor
delete[] _frame_data;
delete[] _frame_color_data;
delete[] _vertexbuf_cache;
- delete[] _vertexbuf_scaled;
- delete[] _vertexbuf_scaled_index;
+ delete[] _camera_quads;
+ delete[] _camera_colors;
}
_frame_data = new GLfloat[ _width * _height ]; //assumes a max
of depth 4
_frame_color_data = new GLubyte[ 4 * _width * _height ]; //for
RGBA
_vertexbuf_cache = new ColoredVertex[ _width * _height ]; //for
unit vectors
- _vertexbuf_scaled = new ColoredVertex[ _width * _height ];
//scaled with z-buffer
- _vertexbuf_scaled_index = new GLushort[ 4 * (_width-1) *
(_height-1) ]; //for indicies to draw a quad
+
+ _camera_quads_size = _height * _width * 4 * 3; //one quad per
pixel, 3 vertex per quad
+ _camera_quads = new GLfloat[ _camera_quads_size ];
+ _camera_colors = new GLubyte[ _camera_quads_size ];
}
//TODO overcome issue when glviewport is set LARGER than the window side
@@ -154,44 +169,6 @@
return NULL; //_frame_data;
}
-//TODO get rid of this
-void StgModelCamera::PrintData( void ) const
-{
- //create depth matrix
- std::cout << "depth <- matrix( c( ";
- for( int j = 0; j < _height; j++ ) {
- for( int i = 0; i < _width; i++ ) {
- int index = i + j * _width;
- const GLubyte* color = _frame_color_data + index * 4;
//TODO might be buggy indexing
- const float length = _frame_data[ index ];
- if( i != 0 || j != 0 )
- std::cout << " ,";
- std::cout << length;
- }
- }
- std::cout << "), " << std::dec << _width << ", " << _height << " )\n\n";
-
- //create color matrix
- std::cout << "hex_cols <- matrix( c( ";
- for( int j = 0; j < _height; j++ ) {
- for( int i = 0; i < _width; i++ ) {
- int index = i + j * _width;
- const GLubyte* color = _frame_color_data + index * 4;
//TODO might be buggy indexing
- const float length = _frame_data[ index ];
- if( i != 0 || j != 0 )
- std::cout << " ,";
- std::cout << "\"#"
- << std::setw( 2 ) << std::setfill('0') <<
std::hex << (int)color[ 0 ]
- << std::setw( 2 ) << std::setfill('0') << std::hex <<
(int)color[ 1 ]
- << std::setw( 2 ) << std::setfill('0') << std::hex <<
(int)color[ 2 ]
- << "\"" ;
- }
- }
- std::cout << "), " << std::dec << _width << ", " << _height << " )\n\n";
-
- std::cout << std::endl;
-}
-
//TODO create lines outlineing camera frustrum, then iterate over each depth
measurement and create a square
void StgModelCamera::DataVisualize( void )
{
@@ -209,17 +186,12 @@
float start_fov = center_horiz + w_fov / 2.0 + 180.0; //start at right
float start_vert_fov = center_vert + h_fov / 2.0 + 90.0; //start at top
- glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); //TODO this doesn't seem
to work.
-
-
int w = _width;
int h = _height;
float a_space = w_fov / w; //degrees between each sample
float vert_a_space = h_fov / h; //degrees between each vertical sample
-
- //TODO - there are still some vertices which aren't accurate - possibly
due to a buffer overflow / memory corruption.
- //In some cases the vertices appear to be below the floor which
shouldn't be possible once the unit vectors are scaled (and should simply hit
the floor, but not pass beneath them)
+ //Create unit vectors representing a sphere - and cache it
if( _valid_vertexbuf_cache == false ) {
for( int j = 0; j < h; j++ ) {
for( int i = 0; i < w; i++ ) {
@@ -242,30 +214,22 @@
glTranslatef( 0, 0, CAMERA_HEIGHT / 2.0 );
glDisable( GL_CULL_FACE );
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
- glBegin( GL_QUADS );
+ //glBegin( GL_QUADS );
+
//Scale cached unit vectors with depth-buffer
float* depth_data = ( float* )( _frame_data );
for( int j = 0; j < h; j++ ) {
for( int i = 0; i < w; i++ ) {
int index = i + j * w;
const ColoredVertex* unit_vertex = _vertexbuf_cache +
index;
- ColoredVertex* scaled_vertex = _vertexbuf_scaled +
index;
- const GLubyte* color = _frame_color_data + index * 4;
const float length = depth_data[ index ];
//scale unitvectors with depth-buffer
- scaled_vertex->x = unit_vertex->x * length;
- scaled_vertex->y = unit_vertex->y * length;
- scaled_vertex->z = unit_vertex->z * length;
+ float sx = unit_vertex->x * length;
+ float sy = unit_vertex->y * length;
+ float sz = unit_vertex->z * length;
- //colour the points
- //TODO color is buggy
- scaled_vertex->r = color[ 0 ];
- scaled_vertex->g = color[ 1 ];
- scaled_vertex->b = color[ 2 ];
- scaled_vertex->a = 0xFF;
-
//create a quad based on the current camera pixel, and
normal vector
//the quad size is porpotial to the depth distance
float x, y, z;
@@ -273,18 +237,36 @@
cross( x, y, z, unit_vertex->x, unit_vertex->y,
unit_vertex->z );
z = length * M_PI * vert_a_space / 360.0;
-
- glColor4ub( color[ 0 ], color[ 1 ], color[ 2 ], 0xFF );
- glVertex3f( scaled_vertex->x - x, scaled_vertex->y - y,
scaled_vertex->z - z );
- glVertex3f( scaled_vertex->x - x, scaled_vertex->y - y,
scaled_vertex->z + z );
- glVertex3f( scaled_vertex->x + x, scaled_vertex->y + y,
scaled_vertex->z + z );
- glVertex3f( scaled_vertex->x + x, scaled_vertex->y + y,
scaled_vertex->z - z );
+ GLfloat* p = _camera_quads + index * 4 * 3;
+ p[ 0 ] = sx - x; p[ 1 ] = sy - y; p[ 2 ] = sz - z;
+ p[ 3 ] = sx - x; p[ 4 ] = sy - y; p[ 5 ] = sz + z;
+ p[ 6 ] = sx + x; p[ 7 ] = sy + y; p[ 8 ] = sz + z;
+ p[ 9 ] = sx + x; p[ 10 ] = sy + y; p[ 11 ] = sz - z;
+ //copy color for each vertex
+ //TODO using a color index would be smarter
+ const GLubyte* color = _frame_color_data + index * 4;
+ for( int i = 0; i < 4; i++ ) {
+ GLubyte* cp = _camera_colors + index * 4 * 3 +
i * 3;
+ memcpy( cp, color, sizeof( GLubyte ) * 3 );
+ }
+
}
}
- glEnd();
+ glEnableClientState( GL_VERTEX_ARRAY );
+ glEnableClientState( GL_COLOR_ARRAY );
+
+ glVertexPointer( 3, GL_FLOAT, 0, _camera_quads );
+ glColorPointer( 3, GL_UNSIGNED_BYTE, 0, _camera_colors );
+ glDrawArrays( GL_QUADS, 0, w * h * 4 );
+
+ glDisableClientState( GL_COLOR_ARRAY );
+ glDisableClientState( GL_VERTEX_ARRAY );
+
+
+// glEnd();
glEnable(GL_CULL_FACE);
return;
Modified: code/stage/trunk/libstage/stage.hh
===================================================================
--- code/stage/trunk/libstage/stage.hh 2008-06-25 19:21:46 UTC (rev 6684)
+++ code/stage/trunk/libstage/stage.hh 2008-06-25 20:09:36 UTC (rev 6685)
@@ -2480,13 +2480,15 @@
bool _valid_vertexbuf_cache;
ColoredVertex* _vertexbuf_cache; //cached unit vectors with
appropriate rotations (these must be scalled by z-buffer length)
- ColoredVertex* _vertexbuf_scaled; //vertex buffer for
visualiation
- GLushort* _vertexbuf_scaled_index; //indecies for scaled buffer
int _width; //width of buffer
int _height; //height of buffer
static const int _depth = 4;
+ int _camera_quads_size;
+ GLfloat* _camera_quads;
+ GLubyte* _camera_colors;
+
StgPerspectiveCamera _camera;
int _yaw_offset;
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit