• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.


  • Content count

  • Joined

  • Last visited

Community Reputation

239 Neutral

About webwraith

  • Rank
  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. 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. 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

    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

    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

    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

    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

    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. @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 )