webwraith

Members
  • Content count

    404
  • Joined

  • Last visited

Community Reputation

239 Neutral

About webwraith

  • Rank
    Member
  1. If you'd like to look at the blog following the development of the procedural terrain engine (not including any modifications made by SOE), it's right here: http://procworld.blogspot.co.uk/
  2. I was being confused by the fact that SMALL_RECTs specify, according to MSDN, the "rows and columns of screen-buffer character cells". I had thought it meant the number of columns and rows visible in the window, but apparently not
  3. I am trying to write some simplified wrappers around the Windows console functions in D. However, for some reason, whenever I try and use SetConsoleScreenBufferSize(), I keep getting error 87, which a quick look up under MSDN reveals to be "ERROR_INVALID_PARAMETER". I have, pretty much, the simplest version of my test code that doesn't run: module sample;   import std.c.windows.windows; import std.conv; import std.format; import std.array; import std.stdio;   alias HANDLE handle;   void main(){ auto buff = CreateConsoleScreenBuffer(GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, null, CONSOLE_TEXTMODE_BUFFER, null); if( buff == INVALID_HANDLE_VALUE ) throw new Exception("Unable to create new screen buffer. Error: " ~ text( GetLastError() ) );   COORD c = {60, 30};   // get the console window dims, to make sure this screen buffer is as large or larger CONSOLE_SCREEN_BUFFER_INFO* csbi = new CONSOLE_SCREEN_BUFFER_INFO;   GetConsoleScreenBufferInfo( buff, csbi ); short width = cast(short)(csbi.srWindow.Right-csbi.srWindow.Left); short height = cast(short)(csbi.srWindow.Bottom-csbi.srWindow.Top);   if(c.X<width) c.X = width; if(c.Y<height) c.Y = height;   // set the screen buffer size !!!<= THIS IS WHAT DOESN'T WORK! if(SetConsoleScreenBufferSize( buff, c ) == 0){ auto err = GetLastError(); throw new Exception("Unable to set buffer dimensions. Error: " ~ text(err) ); }   SetConsoleTextAttribute( buff, defineAttr( Color.White|Color.Intensity, Color.Blue ) ); setCursor( buff, 2, 28 ); readln(); }   enum Color{ Black = 0, Blue = 1, Green = 2, Red = 4, White = 7, Intensity = 8 };   ushort defineAttr(Color fg = Color.Red|Color.Green|Color.Blue, Color bg = Color.Black){ ushort val;   if(fg & Color.Red)       val |= FOREGROUND_RED; if(fg & Color.Green)     val |= FOREGROUND_GREEN; if(fg & Color.Blue)      val |= FOREGROUND_BLUE; if(fg & Color.Intensity) val |= FOREGROUND_INTENSITY;   if(bg & Color.Red)       val |= BACKGROUND_RED; if(bg & Color.Green)     val |= BACKGROUND_GREEN; if(bg & Color.Blue)      val |= BACKGROUND_BLUE; if(bg & Color.Intensity) val |= BACKGROUND_INTENSITY;   return val; }     void setCursor(handle n, short x, short y){ COORD c = {x, y}; SetConsoleCursorPosition( n, c ); }  I don't understand what this "invalid parameter" might be, so if anyone could shine a light on this, I would very much appreciate it. EDIT: I forgot to mention, I have factored out nearly every function here, but the code is otherwise exactly as written. Also, I have tested on both a brand new screen buffer, as well as on the default, both to the same effect. SOLVED: I ended up stealing the DOSBox code linked by aqrit. The original link: http://sourceforge.net/p/dosbox/code-0/HEAD/tree/dosbox/trunk/src/debug/debug_win32.cpp My implementation: /// Shamelessly ripped from the DOSBox sources and adapted for D void setBufferDims(handle n, short w, short h){ assert(n != INVALID_HANDLE_VALUE, "invalid handle passed to setBufferDims()"); CONSOLE_SCREEN_BUFFER_INFO csbi; SMALL_RECT rect; COORD window_dims, win_coords; if(!GetConsoleScreenBufferInfo(n, &csbi)) throw new Exception( "Unable to retrieve console screen buffer data. Error: "~text(GetLastError()) ); // get console window size in cols and rows win_coords = GetLargestConsoleWindowSize( n ); if(win_coords.X == 0 && win_coords.Y == 0) throw new Exception( "Unable to retrieve largest possible window coordinates: "~text(GetLastError()) ); window_dims = csbi.dwSize; rect.Right = cast(short)(min(w, win_coords.X)-1); rect.Bottom = cast(short)(min(h, win_coords.Y)-1); rect.Left = rect.Top = 0; win_coords.X = w; win_coords.Y = h; // if console is smaller than or equal to requested size if(csbi.dwSize.X * csbi.dwSize.Y > w * h){ SetConsoleWindowInfo( n, true, &rect); SetConsoleScreenBufferSize( n, win_coords ); } if(csbi.dwSize.X * csbi.dwSize.Y < w * h){// otherwise // resize console, then buffer SetConsoleScreenBufferSize( n, win_coords ); SetConsoleWindowInfo( n, true, &rect); } } Is it wrong that I find it really cool that the D code is almost identical to its C/C++ origins?
  4. Games for Tournaments

    That is a real looker, I'm going to have to try it out once I clear out my harddrive. Do you know of any others?
  5. Games for Tournaments

    I apologize if this is in the wrong area of the forums, but I had no idea where else to put it.   I have seen quite large followings and even entire tournament scenes spring up around the FPS genre, including Nexuiz and Warsow, Savage, Natural Selection and a few others, but I was wondering if anyone knew if the same happens for games made in other genres. I'm talking games that aren't made by big companies here, of course, so no Starcraft, but a game such as MegaGlest is the sort of thing I'm after. I'm not just looking at RTSs either, any and all genres are welcome, the only requirement being that they have a tournament scene, and be PC games.
  6. Just as a quick question, when you talk about splash screens, do you mean those that come up as a program is loading ( see everything from the latest games to MS Office for examples of this, although my personal favourite are the Adobe ones. ), or do you mean a Title screen, such as that would likely say "Press start to continue"? For the first, I'd use a simple native window which just loads and displays an image and/or some text. This shouldn't be too hard, and you can probably find some decent code for this with a quick Google search. For the title screen, then you should probably treat it like any other "screen" in your game, and use the GLUT methods for reading from the keyboard. If you're having troubles with this part, then let us know. I don't really have a great deal of experience with GLUT myself, but I'm sure someone can give you a hand   Well, that will teach me to read a post properly. I'm not sure why the code isn't working, unless it has to do with you setting button to 0, then checking if it is equal to 32 (I'm assuming you have GLUT code in there to retrieve the key values, but obviously I'm not sure). Other than that, I haven't seen anything in the documentation to suggest that you need to do things differently to how you already are. Unfortunately, that's about as far as my usefulness extends. Best of luck in finding the solution to this problem, and I hope you'll leave a post detailing how you did it if you do.
  7. I'm learning modern OpenGL after dabbling with NeHes tutorials a few years ago. I started following the tutorials here, but I ended up with a problem when I got to the fifth tutorial in the "basics" arc. It required the C++ library GLM, which doesn't have a binding for D, which is the language I'm using for this. Having written up the code now for a simple set of matrix and vector routines, I'm testing and getting some weird results. First off, my rotating cube seems to be horrifically skewed and stretched, but only when I introduce my camera and frustum matrices. Secondly, my cube seems to start clipping when it reaches closer than 0.4 in Z screen space. I have confirmed both my matrix multiplication code, and my frustum matrix having the correct values. I'm not sure what it could be that is affecting this, so this is the code for my "idle" function which is called whenever the "update" function has returned; auto cam = new camera;cam.translate( move_x, 0, move_z+2 ); auto model = new matrix; // frustum matches glFrustum, see that function for arguments auto frust = frustum(-0.5, 0.5, -0.5, 0.5, 0.1, 100 ); auto axis = (new vector( 1, 1, 1 )).normalize; model.translate( move, 0, 0 ); model.rotate( angle, axis ); model.scale( 0.3 ); matrix transform = model * cam * frust; glUseProgram( program ); if( trans_m != -1 ) glUniformMatrix4fv( trans_m, 1, GL_FALSE, transform.cols.ptr ); While the drawing code just takes the vertices and colours and renders them, and the shader uses the matrix created above to transform each vertex. The cube stretches off into the distance, clips before reaching the camera, and skews when viewed from even slightly a different angle to head-on. Needless to say, I'm getting frustrated. I know there probably isn't enough here to go on, but to avoid an info-dump, if you could let me know which parts you would like to look at to work this out, I'll post them up ASAP. Thanks in advance for any help. EDIT: OK, so plenty of views, but no answers? Is it just that people don't have enough experience in D to help, or would it help if I add some more code? I'll include my math module below, sans any functions not being used at the moment, if that helps: module math3d; /+ OpenGL GLSL matrices; Matrices are in column order, so:     [ 0, 4,  8, 12 ]     [ 1, 5,  9, 13 ]     [ 2, 6, 10, 14 ]     [ 3, 7, 11, 15 ] Translation matrix is:     [ 1, 0, 0, x ]     [ 0, 1, 0, y ]     [ 0, 0, 1, z ]     [ 0, 0, 0, 1 ] Rotation( angle, axis ) matrix is:     [ (x^2)*(1-cos(angle))+cos(angle), x*y*(1-cos(angle))-z*sin(angle), x*z*(1-cos(angle))+y*sin(angle), 0 ]     [ x*y*(1-cos(angle))+z*sin(angle), (y^2)*(1-cos(angle))+cos(angle), y*z*(1-cos(angle))-x*sin(angle), 0 ]     [ x*z*(1-cos(angle))-y*sin(angle), y*z*(1-cos(angle))+x*sin(angle), (z^2)*(1-cos(angle))+cos(angle), 0 ]     [                 0,                                    0,                                0,                 1 ] Scale matrix is:     [ x, 0, 0, 0 ]     [ 0, y, 0, 0 ]     [ 0, 0, z, 0 ]     [ 0, 0, 0, 1 ] +/ public import std.math; import std.stdio; class vector{     float[4] array;          this( float a, float b, float c, float d = 1.0f ){         array = [ a, b, c, d ];     }          this(){         this( 0.0, 0.0, 0.0 );     }          this( float[4] r ){         array = r;     }          this( float[] r ){         if( r.length >=4 )             array = r;         else{             array[0..r.length] = r;             array[r.length..$] = 0;             array[3] = 1;         }     }          @property float x(){ return array[0]; }     @property float y(){ return array[1]; }     @property float z(){ return array[2]; }     @property float w(){ return array[3]; }          @property float x( float c ){ return array[0] = c; }     @property float y( float c ){ return array[1] = c; }     @property float z( float c ){ return array[2] = c; }     @property float w( float c ){ return array[3] = c; }          vector opBinary( string op )( vector v ){         return mixin( "new vector( array"~op~"v.array )" );     }          vector opBinary( string op )( matrix m ){         vector ret = new vector;         static if( op == "*" ){             ret.x = x*m.cols[0][0] + x*m.cols[0][1] + x*m.cols[0][2] + x*m.cols[0][3];             ret.y = y*m.cols[0][0] + y*m.cols[0][1] + y*m.cols[0][2] + y*m.cols[0][3];             ret.z = z*m.cols[0][0] + z*m.cols[0][1] + z*m.cols[0][2] + z*m.cols[0][3];             ret.w = w*m.cols[0][0] + w*m.cols[0][1] + w*m.cols[0][2] + w*m.cols[0][3];         }     }          vector normalize(){         import std.math;                  auto sqr = (x*x)+(y*y)+(z*z);         if( sqr != 1.0f ){             auto srt = sqrt( sqr );             array[0] /= srt;             array[1] /= srt;             array[2] /= srt;             array[3]  = 1;         }                  return this;     } } /// simple matrix class. Matrix values are stored in the array in OpenGL( i.e.; column-major ) order. class matrix{     float[16] cols;     private matrix previous;          /// allows us to treat the matrix as though it were the array of 16 floats     alias cols this;          ////////////////     // CONSTRUCTORS     ////////////////     this(){         cols =             [ 1.0, 0.0, 0.0, 0.0,               0.0, 1.0, 0.0, 0.0,               0.0, 0.0, 1.0, 0.0,               0.0, 0.0, 0.0, 1.0 ];              }          this( float[16] vals ){         cols = vals.dup;     }          this( float[4][4] vals ){         cols = vals[0]~vals[1]~vals[2]~vals[3];     }          this( matrix m ){         cols = m.cols.dup;     }          /// returns an identity matrix.     /// Not difficult, as the identity matrix is the default for the matrix class     static matrix identity(){         return new matrix();     }          /// operator overloading. Currently only overloads the '*' operator.     matrix opBinary( string op )( matrix m ){         matrix r = new matrix;                  /++                  At the moment, if the matrices are layed out in the following way;                                      [ t00 t04 t08 t12 ]                              [ t01 t05 t09 t13 ]                             [ t02 t06 t10 t14 ] [ t03 t07 t11 t15 ]                  [ m00 m04 m08 m12 ]    [ r00 r04 r08 r12 ]         [ m01 m05 m09 m13 ]    [ r01 r05 r09 r13 ]         [ m02 m06 m10 m14 ]    [ r02 r06 r10 r14 ]         [ m03 m07 m11 m15 ]    [ r03 r07 r11 r15 ]                  where rXX is the resulting value, tXX is the "this" matrix, and mXX is         the passed-in matrix. If the matrices are messing up, then I may need to         switch the m and t matrices.                  ++/         static if( op == "*" ){             auto t = cols;             r[0]  = m[0]*t[0]  + m[4]*t[1]  + m[8]* t[2]  + m[12]*t[3];             r[1]  = m[1]*t[0]  + m[5]*t[1]  + m[9]* t[2]  + m[13]*t[3];             r[2]  = m[2]*t[0]  + m[6]*t[1]  + m[10]*t[2]  + m[14]*t[3];             r[3]  = m[3]*t[0]  + m[7]*t[1]  + m[11]*t[2]  + m[15]*t[3];                          r[4]  = m[0]*t[4]  + m[4]*t[5]  + m[8]* t[6]  + m[12]*t[7];             r[5]  = m[1]*t[4]  + m[5]*t[5]  + m[9]* t[6]  + m[13]*t[7];             r[6]  = m[2]*t[4]  + m[6]*t[5]  + m[10]*t[6]  + m[14]*t[7];             r[7]  = m[3]*t[4]  + m[7]*t[5]  + m[11]*t[6]  + m[15]*t[7];                          r[8]  = m[0]*t[8]  + m[4]*t[9]  + m[8]* t[10] + m[12]*t[11];             r[9]  = m[1]*t[8]  + m[5]*t[9]  + m[9]* t[10] + m[13]*t[11];             r[10] = m[2]*t[8]  + m[6]*t[9]  + m[10]*t[10] + m[14]*t[11];             r[11] = m[3]*t[8]  + m[7]*t[9]  + m[11]*t[10] + m[15]*t[11];                          r[12] = m[0]*t[12] + m[4]*t[13] + m[8]* t[14] + m[12]*t[15];             r[13] = m[1]*t[12] + m[5]*t[13] + m[9]* t[14] + m[13]*t[15];             r[14] = m[2]*t[12] + m[6]*t[13] + m[10]*t[14] + m[14]*t[15];             r[15] = m[3]*t[12] + m[7]*t[13] + m[11]*t[14] + m[15]*t[15];                      }         else static assert( 0, "Unsupported binary op in math3d.matrix: "~op );                  return r;     }          /// utility method to perform a translation on a matrix     matrix translate( vector v ){         return translate( v.x, v.y, v.z );     }          /// utility method to perform a translation on a matrix     matrix translate( float x, float y, float z ){                  cols[0] += cols[3]*x;    cols[4] += cols[7]*x;    cols[8] += cols[11]*x;    cols[12] += cols[15]*x;         cols[1] += cols[3]*y;    cols[5] += cols[7]*y;    cols[9] += cols[11]*y;    cols[13] += cols[15]*y;         cols[2] += cols[3]*z;    cols[6] += cols[7]*z;    cols[10] += cols[11]*z;    cols[14] += cols[15]*z;                  version(test_matrix) print(this);         return this;     }          /// utility method to perform a rotation on a matrix     matrix rotate( float angle, vector axis ){         version(test_matrix) writefln("entered rotate(float, vector(%s))", axis);         return rotate( angle, axis.x, axis.y, axis.z );         version(test_matrix) writeln("leaving rotate(float, vector)");     }          /// utility method to perform a rotation on a matrix     matrix rotate( float angle, float x, float y, float z ){         version(test_matrix) writefln( "entered rotate(%s, %s, %s, %s)", angle, x, y, z );         matrix m = new matrix;         version(test_matrix) writeln( "\nmatrix m before construction of rotation" );                  float c = cos(angle*(PI/180.0));         float s = sin(angle*(PI/180.0));         version(test_matrix){             writefln( "c: %s\ns: %s\n", c, s );             writefln( "cos(angle*(PI/180.0)): %s\nsin(angle*(PI/180.0)): %s\n", cos(angle*(PI/180.0)), sin(angle*(PI/180.0)) );         }                  auto xx = x*x,            xy = x*y,              xz = x*z,            yy = y*y,              yz = y*z,            zz = z*z;                  m.cols[0] = xx * (1 - c) + c;         m.cols[1] = xy * (1 - c) + z * s;         m.cols[2] = xz * (1 - c) - y * s;         m.cols[3]= 0;         m.cols[4] = xy * (1 - c) - z * s;         m.cols[5] = yy * (1 - c) + c;         m.cols[6] = yz * (1 - c) + x * s;         m.cols[7]= 0;         m.cols[8] = xz * (1 - c) + y * s;         m.cols[9] = yz * (1 - c) - x * s;         m.cols[10]= zz * (1 - c) + c;         m.cols[11]= 0;         m.cols[12] = 0;         m.cols[13] = 0;         m.cols[14]= 0;         m.cols[15]= 1;                  version(test_matrix){             writeln( "\nmatrix m after rotation created:" );             print(m);         }                  cols = ( m*this ).cols;                  version(test_matrix){             writeln( "\nfinal matrix after rotation applied:" );             print(this);         }                  version(test_matrix) writeln("leaving rotate(float, float, float, float)");         return this;     }          matrix rotateX( float angle ){         version(test_matrix) writeln("entered rotateX");         return rotate( angle, 1.0, 0.0, 0.0 );     }     matrix rotateY( float angle ){         version(test_matrix) writeln("entered rotateY");         return rotate( angle, 0.0, 1.0, 0.0 );     }     matrix rotateZ( float angle ){         version(test_matrix) writeln("entered rotateX");         return rotate( angle, 0.0, 0.0, 1.0 );     }          /// utility method to scale the matrix     matrix scale( vector v ){         return scale( v.x, v.y, v.z );     }          matrix scale( float f ){         return scale( f, f, f );     }          matrix scale( float x, float y, float z ){         cols[0] = cols[0]*x;   cols[1] = cols[1]*x;   cols[2] = cols[2]*x;   cols[3] = cols[3]*x;         cols[4] = cols[4]*y;   cols[5] = cols[5]*y;   cols[6] = cols[6]*y;   cols[7] = cols[7]*y;         cols[8] = cols[8]*z;   cols[9] = cols[9]*z;   cols[10]= cols[10]*z;  cols[11]= cols[11]*z;                  return this;     } } /// replacement for gluPerspective. Matches the parameters and results as accurately as the floats allow matrix perspective( float fovInDeg, float aspectRatio, float znear, float zfar ){     float ymax, xmax;     ymax = znear * tan( fovInDeg * PI / 360.0 );     xmax = ymax * aspectRatio;     return frustum( -xmax, xmax, -ymax, ymax, znear, zfar ); } /// replacement for glFrustum. Matches the parameters and results as accurately as the floats allow matrix frustum( float left, float right, float bottom, float top, float znear, float zfar ){     float t1, t2, t3, t4;     t1 = 2.0 * znear;     t2 = right - left;     t3 = top - bottom;     t4 = zfar - znear;          return new matrix(         [             t1/t2, 0, 0, 0,             0, t1/t3, 0, 0,             (right + left)/t2, (top + bottom)/t3, -(zfar + znear)/t4, -1,             0, 0, -(t1*zfar)/t4, 0         ]     ); } I hope this helps, and I'd appreciate any help you guys can give me
  8. I'm currently working on a class-based scripting language as an experiment. I'm using the D programming language, and no IDE. The problem is that I'm not sure how to get the "processor" to search for names. I have the basis of namespaces down in my head, but at the moment I have no way of specifying how to look through imported modules. The following is what I have so far. [code] class Namespace{ Namespace parent; Namespace[ wchar[] ] children; // equivalent to C++'s std::map< std::basic_string< wchar_t >, Namespace > }[/code] I wanted to ask, how would I go about actually importing the symbols of the requested module? Would I, say, keep a link for each module, testing them after testing the current namespace? How do other scripting languages deal with namespaces? [b]EDIT:[/b]At the moment, I have decided to have each namespace contain a "type" value which tells the "processor" whether the namespace is global, module, class or code block. I'm using this to decide how to handle each namespace. Is this a sensible way to go about this?
  9. OpenGL Fighting the (glDraw)Elements

    Got it, as usual I needed to muck around with the view to properly translate and rotate the mesh into view. Darn I suck at this whole 3D business... [imwithstupid]
  10. OpenGL Fighting the (glDraw)Elements

    Oops, got my two files mixed up. You're right sprite_hound, that was the problem with the file I posted [embarrass]. My apologies for an obviously wrong post. OK, so my test file (the one in my last post) is now working, and it's now time to sort out my original source. I'll put up a note on whether it works or not a bit later.
  11. OpenGL Fighting the (glDraw)Elements

    Right, I'm still getting nothing. I didn't want to do a code dump, but it's only 80 lines (with a few blank lines for readability), and I just don't understand what could be wrong. The following code takes into account all comments and suggestions so far, and I still only get the clear color in the window ( I won't post a picture, it'd be pointless ) The code: #include <SFML/Window.hpp> float grid[] = { // triangle -1.5f, 1.0f, -6.0f, -2.5f, -1.0f, -6.0f, -0.5f, -1.0f, -6.0f, // quad 0.5f, 1.0f, -6.0f, 2.5f, 1.0f, -6.0f, 2.5f, -1.0f, -6.0f, 0.5f, -1.0f, -6.0f }; float colors[] = { // triangle 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, // quad 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f }; int main(int arg_count, char ** args){ // create the render window sf::Window window( sf::VideoMode( 800, 600, 32 ), "ProcTerrain", sf::Style::Close ); /// initialize OpenGL glShadeModel( GL_SMOOTH ); glClearDepth( 1.0f ); glClearColor( 0.2f, 0.0f, 0.2f, 0.0f ); glEnable( GL_DEPTH_TEST ); glDepthFunc( GL_LEQUAL ); glDepthMask( GL_TRUE ); glColor3f( 1.0f, 1.0f, 1.0f ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glDisable( GL_CULL_FACE ); glEnableClientState( GL_VERTEX_ARRAY ); glEnableClientState( GL_COLOR_ARRAY ); glVertexPointer( 3, GL_FLOAT, 0, &grid[0] ); glColorPointer( 3, GL_FLOAT, 0, &colors[0] ); /// handle events sf::Event event; float angle = 0.f; float time = 0.f; while( window.IsOpened() ){ /// deal with events while( window.GetEvent(event) ){ switch( event.Type ){ case sf::Event::KeyPressed : { if( event.Key.Code == sf::Key::Escape ) window.Close(); break; } case sf::Event::Closed : { window.Close(); } } } /// to render glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); glDrawArrays( GL_TRIANGLES, 0, 3 ); glDrawArrays( GL_QUADS, 3, 4 ); window.Display(); } glDisableClientState( GL_COLOR_ARRAY ); glDisableClientState( GL_VERTEX_ARRAY ); return 0; } I'm getting a little frustrated with this now, I hope someone can point out my mistake. I really appreciate everyones help with this.
  12. OpenGL Fighting the (glDraw)Elements

    Right, I tried both changing the z position in gluLookAt(), and in glTranslatef(), both individually and together, and I'm still not having any luck. I'm going to go try the new tutorials over on NeHe, and see if they work, although I'm using SFML for the window, and not SDL. EDIT: OK, so I'm back from rewriting this tutorial, and I'm still getting nothing. I'm beginning to wonder if I should switch to SDL and try that to see if I have the same problem... [Edited by - webwraith on January 1, 2011 9:46:51 AM]
  13. OpenGL Fighting the (glDraw)Elements

    Nope, I already call glVertexPointer, I'd just forgotten to cnp it. I've tried disabling culling, but I still don't see anything, and cam.fine_y translates to 0 at the moment, as I all but stripped out the movement code. My projection matrix is set up with gluLookAt( 0.f, 6.f, 0.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f );
  14. I'm trying to get a simple grid drawn in OpenGL for a proof of concept, but I'm having troubles. Originally, the grid was procedurally generated from a number of vertices, but I couldn't get the grid to render. I tried reducing the code to a pre-calculated 5 square verts, but I still get no grid. I'm pretty sure it's either the order of indices, or an error in my calls to render. the code that defines the 5x5 grid, and the indices for a set of triangle strips; float grid[] = { -2.f, 0.f, 2.f, -1.f, 0.f, 2.f, 0.f, 0.f, 2.f, 1.f, 0.f, 2.f, 2.f, 0.f, 2.f , -2.f, 0.f, 1.f, -1.f, 0.f, 1.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 2.f, 0.f, 1.f , -2.f, 0.f, 0.f, -1.f, 0.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 2.f, 0.f, 0.f , -2.f, 0.f, -1.f, -1.f, 0.f, -1.f, 0.f, 0.f, -1.f, 1.f, 0.f, -1.f, 2.f, 0.f, -1.f , -2.f, 0.f, -2.f, -1.f, 0.f, -2.f, 0.f, 0.f, -2.f, 1.f, 0.f, -2.f, 2.f, 0.f, -2.f }; unsigned short index[] = { 0, 5, 1, 6, 2, 7, 3, 8, 4, 9 , 5, 10, 6, 11, 7, 12, 8, 13, 9, 14 , 10, 15, 11, 16, 12, 17, 13, 18, 14, 19 , 15, 20, 16, 21, 17, 22, 18, 23, 19, 24 }; and the code to render; glLoadIdentity(); // move the modelview matrix by 0.008 * the fine coords glTranslatef( 0.0f, -4.0f, ( 0.008f * ( float ) cam.fine_y ) * -1 ); glRotatef( angle, 1.f, 0.f, 0.f); // render the vertices in strips, which don't change their // relationships with each other. glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glDrawRangeElements( GL_TRIANGLE_STRIP, 0, 9, 14, GL_UNSIGNED_SHORT, index ); The "angle" variable is updated each frame, in an attempt to make sure I'm not looking in the wrong direction. I've tried glDrawElements, glDrawRangeElements, glMultiDrawElements and glDrawArray, all with no success. I get the feeling I should be using glMultiDrawArrays, but if I've done the above wrong, it would really help for someone to point out which value/variable should actually be used. I know that the screen is updating successfully, as I can get the clear colour to change during runtime. Many thanks in advance.
  15. What engine should I use as a beginner?

    @AdrianC: technically, OGRE is a graphics engine, and requires other libraries to create a full game. @mikeman: for C++, there's also SFML, which I, at least, found easier to use. @OP: have you tried searching on devmaster.net's engine list? Also, what about the Unreal engine? I know you said you wanted a C++ engine, but it is proven, and could get you up and running in no time. Alternatively, the idTech 4 engine, or the Half Life engines are both in C++. I suppose with the above choices, it boils down to wether you want a completely standalone game ( still possible with Half Life, need to buy for idTech 4 and Unreal, unless you're OK with "mod" style games )