• 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.
Sign in to follow this  
Followers 0
JavaCoolDude

OpenGL
OpenGL GUI anyone? Updated on 11/17/05

207 posts in this topic

~ 800fps windowed.
~200 fullscreen

AMD 3000+
ATI Radeon 256mb 9600xt
1gb of RAM

Just an idea...

Maybe the ability to select the text in the text box.

The ability to put radio buttons into different groups so that each group of radio buttons could only have one selected at a time.

Maybe like a grid box or a grid of editable fields(forget what its called..lol).

Able to have different colored characters in a string for a label or button, ie a smiple text markup language ^1 would represent red or ^3 green, etc...

Maybe a Messagebox system (modal non-modal).

How about a custom cusor?

Hope that helps and I'll try and come up with more later.
0

Share this post


Link to post
Share on other sites
Thanks for your feedback guys, I appreciate it a lot.
Ok so I went ahead and implemented few more things like Vertical sliders, and tiled textured buttons.
Also I simplified the setup file by breaking it into several smaller files, look into the Data/GUI folder for more details [smile]
Check the main post for the updated binaries and pictures, ok back to implementing the rest of the suggested features.
Peace
PS: Kusma, I set the radio buttons to fade and come back three times as fast as anything else in the current frame, you can change the timing by modifying the alphaFadeScale in the XML files.

[Edited by - JavaCoolDude on June 15, 2005 7:56:36 PM]
0

Share this post


Link to post
Share on other sites
Looks like a great GUI, can't wait to see it in some games. The one improvment that I found immediately is the fact that arrows keys don't work in the text boxes, and I use the arrow keys all the time. Just an idea.

Other than that, and the improvements already stated, looks really nice, can't wait to see the code :)

~Zix~

EDIT: And it runs at ~1000 FPS on my system, 2.6 ghz, Gefroce 6600
0

Share this post


Link to post
Share on other sites
Really good job! :D

430 FPS with default windowed size
210 FPS with 1280*1024 windowed size

CPU: Intel P4 3GHz (Prescott 478)
RAM: 1GB PC3200
Card: ATI Radeon 9600 256MB DDR (Sapphire)
0

Share this post


Link to post
Share on other sites
hmm as this is an on going thread which might be of intrest to some people i'm gonna sticky it for a while, as a decent GUI is something alot of people have been asking for [smile]
0

Share this post


Link to post
Share on other sites
W00t, thanks Phantom my man :D
Now I am trying to remove the GUI dependance from my own engine, I would like one of you fellas to provide me with a simple GLUT application with a mouse and keyboard listener as well as a main loop [smile]

[Edited by - JavaCoolDude on June 15, 2005 9:21:41 PM]
0

Share this post


Link to post
Share on other sites
Very nice, hope to make one this good myself.

~270 FPS
CPU: 2.8GHz Celeron
GPU: 128MB ATI Radeon 9250 Xtasy Series
RAM: 1GB PC3200

0

Share this post


Link to post
Share on other sites
Quote:
Original post by JavaCoolDude
Now I would like one of you fellas to provide me with a simple GLUT application with a mouse and keyboard listener and a main loop; I'm trying to remove the GUI dependance from my own engine :)



#include "glut.h"

void changeSize( int w, int h )
{
// Prevent a divide by zero, when window is too short
// (you cant make a window of zero width).
if(h == 0)
h = 1;

float ratio = 1.0f * w / h;
// Reset the coordinate system before modifying
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// Set the viewport to be the entire window
glViewport(0, 0, w, h);

// Set the clipping volume
gluPerspective( 45, ratio, 1, 1000 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}

void initScene()
{
glEnable(GL_DEPTH_TEST);
}

void renderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glutSwapBuffers();
}

void processNormalKeys(unsigned char key, int x, int y)
{
if (key == 27)
exit(0);
}

void inputKey(int key, int x, int y)
{
switch (key)
{
case GLUT_KEY_LEFT :
break;

case GLUT_KEY_RIGHT :
break;

case GLUT_KEY_UP :
break;

case GLUT_KEY_DOWN :
break;
}
}

void processMouse(int button, int state, int x, int y)
{
int specialKey = glutGetModifiers();

// if both a mouse button, and the ALT key, are pressed then
if ((state == GLUT_DOWN) && (specialKey == GLUT_ACTIVE_ALT))
{
// set the color to pure red for the left button
// if (button == GLUT_LEFT_BUTTON)

// set the color to pure green for the middle button
//else if (button == GLUT_MIDDLE_BUTTON)

// set the color to pure blue for the right button
// else
}
}

void processMouseActiveMotion(int x, int y) {

//if (specialKey == GLUT_ACTIVE_SHIFT)

//else if (specialKey == GLUT_ACTIVE_CTRL)

//else if (specialKey == GLUT_ACTIVE_ALT)

//else
}

void processMousePassiveMotion(int x, int y)
{
//if (specialKey == GLUT_ACTIVE_SHIFT)

//else if (specialKey == GLUT_ACTIVE_CTRL)

//else if (specialKey == GLUT_ACTIVE_ALT)

//else
}

void processMouseEntry(int state)
{
//if ( state == GLUT_LEFT )

//if( state == GLUT_ENTERED )
}

int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(640,360);
glutCreateWindow("GLUT");

initScene();

// Keyboard
glutKeyboardFunc(processNormalKeys);
glutSpecialFunc(inputKey);

// Display and Idle
glutDisplayFunc(renderScene);
glutIdleFunc(renderScene);

glutReshapeFunc(changeSize);

// Mouse stuff
glutMouseFunc(processMouse);
glutMotionFunc(processMouseActiveMotion);
glutPassiveMotionFunc(processMousePassiveMotion);
glutEntryFunc(processMouseEntry);

glutMainLoop();

return(0);
}



Ok here is something put together from a lot of the LightHouse3D Glut tutorials. If you take a look at the tutorials under the 'Input' category, it shows the mouse and keyboard stuff in more detail as to what you can use.

For more information on stuff that you can use, right click on a define'd expression and 'Go to declaration' to see more of it's kind. Good luck!
0

Share this post


Link to post
Share on other sites
WOW! it ran steady at 1000fps.

athlon 3200 (32bit)
1gb pc3200
9800pro

btw dude ive seen your work, absolutely awesome!!! u seem to be a god of graphic programming. i hope to be as good as you someday...
0

Share this post


Link to post
Share on other sites
Quote:
Original post by Drew_Benton
Ok here is something put together from a lot of the LightHouse3D Glut tutorials. If you take a look at the tutorials under the 'Input' category, it shows the mouse and keyboard stuff in more detail as to what you can use.

For more information on stuff that you can use, right click on a define'd expression and 'Go to declaration' to see more of it's kind. Good luck!


Thanks dude, the code you posted helped me out a lot.

Ok ladies and gentlemen, announcing SXML GUI 0.5 for WIN users, grab it right here while it's still hot.
Here's a list of what you get:
Buttons, TextBoxes, vertical and horizontal sliders, Radio Buttons, CheckBoxes, Panels, Separators, Labels.
A TextureLoader and manager, no image would be loaded twice ;)
A MediaPathManager.
A lousy XML loader [pig]
Some other cool stuff.

I haven't used Linux that much therefore I have no clue on how to go about implementing a robust timer in the said environment. If anyone out there can look at the code and modify Tools/FPSCounter and Tools/Benchmark to whatever Linux uses you'll be my hero...well for a day or two :D
0

Share this post


Link to post
Share on other sites
Oh wow, that's great! I just tried it in the GLUT example and I must say, quite impressive! When I get my dev computer up and running in a week or so, I will definitly start messing with this library [wink] Thanks for all the hard work!
0

Share this post


Link to post
Share on other sites
yeah nice work mate, the demo run's just fine ...haven't had a chance yet to play around with it but will do in the next few days

0

Share this post


Link to post
Share on other sites
okay, i think you kinda misunderstood me ;)
the fade i was talking about wasn't the hover-fade, but rather the selection-change-fade. another note is that in the 0.5-release, moving the cursor in textboxes with the arrow-keys seems to be broken. as a user, i would also like to be able to select a chunk of text with both shift+arrow-keys and the mouse-cursor if possible. other than that, this seems like a really nice gui-library, by the way :)
0

Share this post


Link to post
Share on other sites
how would you make this GUI in pure openGL/glut style mode..kinda like what JavaDude was asking about? i mean yeah you have your textures and your font etc etc but i guess how do you make them react to each other.. i guess by checking mouse over or something, i concur that someone would get some major props for writing a tut on this :)
0

Share this post


Link to post
Share on other sites
Although I think it's great what you've done, what I'm interested in is how does one link actions to the widgets? If I have a void Quit(void) function, how do I bind it to a button? I've taken a quick look at the source of the demo, but the widgets there don't seem to be connected to anything. Could you give an example of how you bind functions?
0

Share this post


Link to post
Share on other sites
Yup, in the GLUT example if look for this section of the code in the Main.cpp file:


void EventsHandler::actionPerformed(GUIEvent evt)
{
const String &callbackString = evt.getCallbackString();
GUIRectangle *sourceRectangle = evt.getEventSource();
int widgetType = sourceRectangle->getWidgetType();

if(widgetType == CHECK_BOX)
{
GUICheckBox *checkBox = (GUICheckBox*)sourceRectangle;
}

if(widgetType == SLIDER)
{
GUISlider *slider = (GUISlider*)sourceRectangle;
if(callbackString == "s1")
slider->setLabelString(String("Slider 1: ") + int(slider->getProgress()*10));

if(callbackString == "s2")
slider->setLabelString(String("Slider 2: ") + int(slider->getProgress()*10));
}

if(widgetType == BUTTON)
{
GUIButton *button = (GUIButton*)sourceRectangle;
if(callbackString == "exit")
if(button->isClicked())
exit(0);
}

if(widgetType == RADIO_BUTTON)
{
GUIRadioButton *radioButton = (GUIRadioButton*)sourceRectangle;
}

}




If the user performs any of the following actions on a given widget


bool isMouseOver();
bool isReleased();
bool isFocused();
bool isDragged();
bool isClicked();
bool isPressed();


the actionPerformed function in the EventHandler will be called. Let's concentrate on this particular chunk:


if(widgetType == BUTTON)
{
GUIButton *button = (GUIButton*)sourceRectangle;
if(callbackString == "exit")
if(button->isClicked())
exit(0);
}


The code says if the widget that the user interacted with is of type BUTTON, the above chunk will be executed. More precisely, if your button has a callback string "exit" defined in your XML GUI layout, the function exit(0) will be called when your said widget is clicked "isClicked()"

Remember to register an EventHandler to stream all of your widgets events into a particular location [smile]
0

Share this post


Link to post
Share on other sites
Ouch.

I thought that was where it was happening.It works ok for small programs and demos, but if you need to make the GUI for an RTS or a RPG like this it'll be terrible.
0

Share this post


Link to post
Share on other sites
Not necessarily, one can always retrieve the name of the parent panel and direct the event to another function, check this out:


GUIPanel *parentPanel = (GUIPanel *)evt.getEventSource()->getParent();
const String &callbackString = evt.getCallbackString();
const String &parentName = parentPanel->getCallbackString();

if(parentName == "SomeRandomName")
{
someOtherEventHandler.actionPerformed(evt);
return;
}


That way we can separate things out depending on the panel where the action has occured, besides there are few other tricks as well, let me finish this tutorial and I'll come back to you. Unless you have a better way to approach this problem [smile]
0

Share this post


Link to post
Share on other sites
Ok here comes a quick tutorial:
Here we want to implement three sliders that control the background color of our application.
Since we don't want to stuff more code in the existent XML files, for simplicity sake we will create another file: ColorSliders.xml
We want the sliders to be grouped all together and located in the upper-right corner of our window, let's start off by creating the panel that will hold em together


<Panel name = "Color Sliders Group"
layout = "CEN_YAXIS"
anchorPoint = "CORNERRU"
drawBounds = "true"
drawBackground = "true">
</Panel>




In the above code, the group name is "Color Sliders Group", every group need a name otherwise it won't be attached to the GUI at runtime.
The layout is "cascading and centered around the y axis", meaning that anything added to the group will be relocated right under the previous element.
The anchor point is where we want the center of the Panel to be considered, there are five options explained in the next ASCII drawing:


CORNERLU CORNERRU
( )-----------------( )
| |
| CENTER |
| |
( )-----------------( )
CORNERLD CORNERRD




drawBounds tells the Panel whether we want visible bounds or not.
drawBackground tells the Panel whether we want a visible background or not.
Since we want our panel to sit in the top-right corner of our main window, let's add this line:


<Position x = "-10" y = "10"/>


If x is negative, it tells the parent panel that the current widget's center should be placed n pixels away from its right border.

Ok let's add a visible title to our panel


<Panel name = "Color Sliders Group"
layout = "CEN_YAXIS"
anchorPoint = "CORNERRU"
drawBounds = "true"
drawBackground = "true">

<Position x = "-10" y = "10"/>

<Label name = "Title">
<Text string = "Color Sliders" fontIndex ="1" wScale = "0.5" hScale = "0.5">
<Color r = "255" g = "180" b = "40" />
</Text>
</Label>
</Panel>




The title is simply a Label, we want the font to be the SECOND decalred one in the main GUILayout.xml file. Since the original size of the font is too big, we scale it down along the xaxis by half (wScale = "0.5") and do the same for the height of the label (hScale = "0.5").
The Color components are defined as:
Red could be x, X, r or R
Green could be g, G, Y or y
Blue could be b, B, z, Z
If the value of any color component is above 1, it will automatically be divided by 255. Therefore for a totally blue color, we set r and g to 0, and b to either 1.0 or 255.0.

Ok now that we're done with the title, let's add a thin line to separate things out:


<Panel name = "Color Sliders Group"
layout = "CEN_YAXIS"
anchorPoint = "CORNERRU"
drawBounds = "true"
drawBackground = "true">
<Label name = "Title">
<Text string = "Color Sliders" fontIndex ="1" wScale = "0.5" hScale = "0.5">
<Color r = "255" g = "180" b = "40" />
</Text>
</Label>

<Separator ratio = "1.0" />
</Panel>




The line will stretch from one side to the other since the ratio is "1.0", ratio will always be clamped to the [0.01 1.0] range.

Now here comes the important part, the sliders:
A single slider will look like this

 
<Slider callbackString = "red"
progress = "0.0">
<Text string = "Red" />
</Slider>


From that code we get to know that the slider disc will be initially set all the way to the left since progress is zero, the callback string is "red" and the visible title is also "Red". Using this same example we extend our panel to include two more sliders, here's the final result:


<Panel name = "Color Sliders Group"
layout = "CEN_YAXIS"
anchorPoint = "CORNERRU"
drawBounds = "true"
drawBackground = "true">

<BordersColor x = "216" y = "169" z = "0" />
<BGColor x = "50" y = "50" z = "50" />
<Position x = "-10" y = "10"/>


<Label name = "Title">
<Text string = "Color Sliders" fontIndex ="1" wScale = "0.5" hScale = "0.5">
<Color r = "255" g = "180" b = "40" />
</Text>
</Label>

<Separator ratio = "1.0" />

<Slider callbackString = "red"
progress = "0.0">
<Text string = "Red" />
</Slider>

<Slider callbackString = "green"
progress = "0.0">
<Text string = "Green" />
</Slider>

<Slider callbackString = "blue"
progress = "0.0">
<Text string = "Blue" />
</Slider>

</Panel>




Copy and save that code into let's say ColorSliders.xml

Once we're done with that, let's go ahead an open the main GUI file, GUILayout.xml:
Let's add this entry under Font

<Panel description = "ColorSliders.xml" />

Voila, we have our sliders [smile]

We're not done yet, we want them to modify the background color as we drag them around.
In Main.cpp, let's add these 3 float variables:


float red = 0.0f,
green = 0.0f,
blue = 0.0f;


In the renderScene() function, let's add this line right after counter.markFrameStart();

[code]
glClearColor(red, green, blue, 0.0f);
[code]

Now in "void EventsHandler::actionPerformed(GUIEvent evt)" right after

if(callbackString == "s2")
slider->setLabelString(String("Slider 2: ") + int(slider->getProgress()*10));


add these lines


if(callbackString == "red") red = slider->getProgress();
if(callbackString == "blue") blue = slider->getProgress();
if(callbackString == "green") green = slider->getProgress();




TADA, we're done compile and give it a go [smile]
0

Share this post


Link to post
Share on other sites
++rating for you javacooldude :) that will get me started at least. ive NEVER doen any xml so all this is new to me. i was wondering where all the string functions were coming from but realized i guess this is built into the xml language. one question now.. is this portable.. i mean will this work on lets say a linux system? :)
0

Share this post


Link to post
Share on other sites
Quote:
Original post by OpenGL_Guru
++rating for you javacooldude :) that will get me started at least. ive NEVER doen any xml so all this is new to me. i was wondering where all the string functions were coming from but realized i guess this is built into the xml language. one question now.. is this portable.. i mean will this work on lets say a linux system? :)


If you figure out how to implement a timer in Linux and manage to modify my Tools/FPSCounter and Tools/Timer, you're gold [smile]
0

Share this post


Link to post
Share on other sites
Quote:
If you figure out how to implement a timer in Linux and manage to modify my Tools/FPSCounter and Tools/Timer, you're gold


UGHH -- well in linux i really dont care about the FPS counter or keeping track of the FPS counter.


im gonna work on it and try things out though....

also gonan look at the GLUT version you have there.. oh yeah if you still need that favor, whatever that is, lemme know :)
0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Similar Content

    • By DaniDesu
      #include "MyEngine.h" int main() { MyEngine myEngine; myEngine.run(); return 0; } MyEngine.h
      #pragma once #include "MyWindow.h" #include "MyShaders.h" #include "MyShapes.h" class MyEngine { private: GLFWwindow * myWindowHandle; MyWindow * myWindow; public: MyEngine(); ~MyEngine(); void run(); }; MyEngine.cpp
      #include "MyEngine.h" MyEngine::MyEngine() { MyWindow myWindow(800, 600, "My Game Engine"); this->myWindow = &myWindow; myWindow.createWindow(); this->myWindowHandle = myWindow.getWindowHandle(); // Load all OpenGL function pointers for use gladLoadGLLoader((GLADloadproc)glfwGetProcAddress); } MyEngine::~MyEngine() { this->myWindow->destroyWindow(); } void MyEngine::run() { MyShaders myShaders("VertexShader.glsl", "FragmentShader.glsl"); MyShapes myShapes; GLuint vertexArrayObjectHandle; float coordinates[] = { 0.5f, 0.5f, 0.0f, 0.5f, -0.5f, 0.0f, -0.5f, 0.5f, 0.0f }; vertexArrayObjectHandle = myShapes.drawTriangle(coordinates); while (!glfwWindowShouldClose(this->myWindowHandle)) { glClearColor(0.5f, 0.5f, 0.5f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Draw something glUseProgram(myShaders.getShaderProgram()); glBindVertexArray(vertexArrayObjectHandle); glDrawArrays(GL_TRIANGLES, 0, 3); glfwSwapBuffers(this->myWindowHandle); glfwPollEvents(); } } MyShaders.h
      #pragma once #include <glad\glad.h> #include <GLFW\glfw3.h> #include "MyFileHandler.h" class MyShaders { private: const char * vertexShaderFileName; const char * fragmentShaderFileName; const char * vertexShaderCode; const char * fragmentShaderCode; GLuint vertexShaderHandle; GLuint fragmentShaderHandle; GLuint shaderProgram; void compileShaders(); public: MyShaders(const char * vertexShaderFileName, const char * fragmentShaderFileName); ~MyShaders(); GLuint getShaderProgram(); const char * getVertexShaderCode(); const char * getFragmentShaderCode(); }; MyShaders.cpp
      #include "MyShaders.h" MyShaders::MyShaders(const char * vertexShaderFileName, const char * fragmentShaderFileName) { this->vertexShaderFileName = vertexShaderFileName; this->fragmentShaderFileName = fragmentShaderFileName; // Load shaders from files MyFileHandler myVertexShaderFileHandler(this->vertexShaderFileName); this->vertexShaderCode = myVertexShaderFileHandler.readFile(); MyFileHandler myFragmentShaderFileHandler(this->fragmentShaderFileName); this->fragmentShaderCode = myFragmentShaderFileHandler.readFile(); // Compile shaders this->compileShaders(); } MyShaders::~MyShaders() { } void MyShaders::compileShaders() { this->vertexShaderHandle = glCreateShader(GL_VERTEX_SHADER); this->fragmentShaderHandle = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(this->vertexShaderHandle, 1, &(this->vertexShaderCode), NULL); glShaderSource(this->fragmentShaderHandle, 1, &(this->fragmentShaderCode), NULL); glCompileShader(this->vertexShaderHandle); glCompileShader(this->fragmentShaderHandle); this->shaderProgram = glCreateProgram(); glAttachShader(this->shaderProgram, this->vertexShaderHandle); glAttachShader(this->shaderProgram, this->fragmentShaderHandle); glLinkProgram(this->shaderProgram); return; } GLuint MyShaders::getShaderProgram() { return this->shaderProgram; } const char * MyShaders::getVertexShaderCode() { return this->vertexShaderCode; } const char * MyShaders::getFragmentShaderCode() { return this->fragmentShaderCode; } MyWindow.h
      #pragma once #include <glad\glad.h> #include <GLFW\glfw3.h> class MyWindow { private: GLFWwindow * windowHandle; int windowWidth; int windowHeight; const char * windowTitle; public: MyWindow(int windowWidth, int windowHeight, const char * windowTitle); ~MyWindow(); GLFWwindow * getWindowHandle(); void createWindow(); void MyWindow::destroyWindow(); }; MyWindow.cpp
      #include "MyWindow.h" MyWindow::MyWindow(int windowWidth, int windowHeight, const char * windowTitle) { this->windowHandle = NULL; this->windowWidth = windowWidth; this->windowWidth = windowWidth; this->windowHeight = windowHeight; this->windowTitle = windowTitle; glfwInit(); } MyWindow::~MyWindow() { } GLFWwindow * MyWindow::getWindowHandle() { return this->windowHandle; } void MyWindow::createWindow() { // Use OpenGL 3.3 and GLSL 3.3 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // Limit backwards compatibility glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Prevent resizing window glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); // Create window this->windowHandle = glfwCreateWindow(this->windowWidth, this->windowHeight, this->windowTitle, NULL, NULL); glfwMakeContextCurrent(this->windowHandle); } void MyWindow::destroyWindow() { glfwTerminate(); } MyShapes.h
      #pragma once #include <glad\glad.h> #include <GLFW\glfw3.h> class MyShapes { public: MyShapes(); ~MyShapes(); GLuint & drawTriangle(float coordinates[]); }; MyShapes.cpp
      #include "MyShapes.h" MyShapes::MyShapes() { } MyShapes::~MyShapes() { } GLuint & MyShapes::drawTriangle(float coordinates[]) { GLuint vertexBufferObject{}; GLuint vertexArrayObject{}; // Create a VAO glGenVertexArrays(1, &vertexArrayObject); glBindVertexArray(vertexArrayObject); // Send vertices to the GPU glGenBuffers(1, &vertexBufferObject); glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject); glBufferData(GL_ARRAY_BUFFER, sizeof(coordinates), coordinates, GL_STATIC_DRAW); // Dertermine the interpretation of the array buffer glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), (void *)0); glEnableVertexAttribArray(0); // Unbind the buffers glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); return vertexArrayObject; } MyFileHandler.h
      #pragma once #include <cstdio> #include <cstdlib> class MyFileHandler { private: const char * fileName; unsigned long fileSize; void setFileSize(); public: MyFileHandler(const char * fileName); ~MyFileHandler(); unsigned long getFileSize(); const char * readFile(); }; MyFileHandler.cpp
      #include "MyFileHandler.h" MyFileHandler::MyFileHandler(const char * fileName) { this->fileName = fileName; this->setFileSize(); } MyFileHandler::~MyFileHandler() { } void MyFileHandler::setFileSize() { FILE * fileHandle = NULL; fopen_s(&fileHandle, this->fileName, "rb"); fseek(fileHandle, 0L, SEEK_END); this->fileSize = ftell(fileHandle); rewind(fileHandle); fclose(fileHandle); return; } unsigned long MyFileHandler::getFileSize() { return (this->fileSize); } const char * MyFileHandler::readFile() { char * buffer = (char *)malloc((this->fileSize)+1); FILE * fileHandle = NULL; fopen_s(&fileHandle, this->fileName, "rb"); fread(buffer, this->fileSize, sizeof(char), fileHandle); fclose(fileHandle); buffer[this->fileSize] = '\0'; return buffer; } VertexShader.glsl
      #version 330 core layout (location = 0) vec3 VertexPositions; void main() { gl_Position = vec4(VertexPositions, 1.0f); } FragmentShader.glsl
      #version 330 core out vec4 FragmentColor; void main() { FragmentColor = vec4(1.0f, 0.0f, 0.0f, 1.0f); } I am attempting to create a simple engine/graphics utility using some object-oriented paradigms. My first goal is to get some output from my engine, namely, a simple red triangle.
      For this goal, the MyShapes class will be responsible for defining shapes such as triangles, polygons etc. Currently, there is only a drawTriangle() method implemented, because I first wanted to see whether it works or not before attempting to code other shape drawing methods.
      The constructor of the MyEngine class creates a GLFW window (GLAD is also initialized here to load all OpenGL functionality), and the myEngine.run() method in Main.cpp is responsible for firing up the engine. In this run() method, the shaders get loaded from files via the help of my FileHandler class. The vertices for the triangle are processed by the myShapes.drawTriangle() method where a vertex array object, a vertex buffer object and vertrex attributes are set for this purpose.
      The while loop in the run() method should be outputting me the desired red triangle, but all I get is a grey window area. Why?
      Note: The shaders are compiling and linking without any errors.
      (Note: I am aware that this code is not using any good software engineering practices (e.g. exceptions, error handling). I am planning to implement them later, once I get the hang of OpenGL.)

       
    • By KarimIO
      EDIT: I thought this was restricted to Attribute-Created GL contexts, but it isn't, so I rewrote the post.
      Hey guys, whenever I call SwapBuffers(hDC), I get a crash, and I get a "Too many posts were made to a semaphore." from Windows as I call SwapBuffers. What could be the cause of this?
      Update: No crash occurs if I don't draw, just clear and swap.
      static PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be { sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor 1, // Version Number PFD_DRAW_TO_WINDOW | // Format Must Support Window PFD_SUPPORT_OPENGL | // Format Must Support OpenGL PFD_DOUBLEBUFFER, // Must Support Double Buffering PFD_TYPE_RGBA, // Request An RGBA Format 32, // Select Our Color Depth 0, 0, 0, 0, 0, 0, // Color Bits Ignored 0, // No Alpha Buffer 0, // Shift Bit Ignored 0, // No Accumulation Buffer 0, 0, 0, 0, // Accumulation Bits Ignored 24, // 24Bit Z-Buffer (Depth Buffer) 0, // No Stencil Buffer 0, // No Auxiliary Buffer PFD_MAIN_PLANE, // Main Drawing Layer 0, // Reserved 0, 0, 0 // Layer Masks Ignored }; if (!(hDC = GetDC(windowHandle))) return false; unsigned int PixelFormat; if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd))) return false; if (!SetPixelFormat(hDC, PixelFormat, &pfd)) return false; hRC = wglCreateContext(hDC); if (!hRC) { std::cout << "wglCreateContext Failed!\n"; return false; } if (wglMakeCurrent(hDC, hRC) == NULL) { std::cout << "Make Context Current Second Failed!\n"; return false; } ... // OGL Buffer Initialization glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); glBindVertexArray(vao); glUseProgram(myprogram); glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, (void *)indexStart); SwapBuffers(GetDC(window_handle));  
    • By Tchom
      Hey devs!
       
      I've been working on a OpenGL ES 2.0 android engine and I have begun implementing some simple (point) lighting. I had something fairly simple working, so I tried to get fancy and added color-tinting light. And it works great... with only one or two lights. Any more than that, the application drops about 15 frames per light added (my ideal is at least 4 or 5). I know implementing lighting is expensive, I just didn't think it was that expensive. I'm fairly new to the world of OpenGL and GLSL, so there is a good chance I've written some crappy shader code. If anyone had any feedback or tips on how I can optimize this code, please let me know.
       
      Vertex Shader
      uniform mat4 u_MVPMatrix; uniform mat4 u_MVMatrix; attribute vec4 a_Position; attribute vec3 a_Normal; attribute vec2 a_TexCoordinate; varying vec3 v_Position; varying vec3 v_Normal; varying vec2 v_TexCoordinate; void main() { v_Position = vec3(u_MVMatrix * a_Position); v_TexCoordinate = a_TexCoordinate; v_Normal = vec3(u_MVMatrix * vec4(a_Normal, 0.0)); gl_Position = u_MVPMatrix * a_Position; } Fragment Shader
      precision mediump float; uniform vec4 u_LightPos["+numLights+"]; uniform vec4 u_LightColours["+numLights+"]; uniform float u_LightPower["+numLights+"]; uniform sampler2D u_Texture; varying vec3 v_Position; varying vec3 v_Normal; varying vec2 v_TexCoordinate; void main() { gl_FragColor = (texture2D(u_Texture, v_TexCoordinate)); float diffuse = 0.0; vec4 colourSum = vec4(1.0); for (int i = 0; i < "+numLights+"; i++) { vec3 toPointLight = vec3(u_LightPos[i]); float distance = length(toPointLight - v_Position); vec3 lightVector = normalize(toPointLight - v_Position); float diffuseDiff = 0.0; // The diffuse difference contributed from current light diffuseDiff = max(dot(v_Normal, lightVector), 0.0); diffuseDiff = diffuseDiff * (1.0 / (1.0 + ((1.0-u_LightPower[i])* distance * distance))); //Determine attenuatio diffuse += diffuseDiff; gl_FragColor.rgb *= vec3(1.0) / ((vec3(1.0) + ((vec3(1.0) - vec3(u_LightColours[i]))*diffuseDiff))); //The expensive part } diffuse += 0.1; //Add ambient light gl_FragColor.rgb *= diffuse; } Am I making any rookie mistakes? Or am I just being unrealistic about what I can do? Thanks in advance
    • By yahiko00
      Hi,
      Not sure to post at the right place, if not, please forgive me...
      For a game project I am working on, I would like to implement a 2D starfield as a background.
      I do not want to deal with static tiles, since I plan to slowly animate the starfield. So, I am trying to figure out how to generate a random starfield for the entire map.
      I feel that using a uniform distribution for the stars will not do the trick. Instead I would like something similar to the screenshot below, taken from the game Star Wars: Empire At War (all credits to Lucasfilm, Disney, and so on...).

      Is there someone who could have an idea of a distribution which could result in such a starfield?
      Any insight would be appreciated
    • By afraidofdark
      I have just noticed that, in quake 3 and half - life, dynamic models are effected from light map. For example in dark areas, gun that player holds seems darker. How did they achieve this effect ? I can use image based lighting techniques however (Like placing an environment probe and using it for reflections and ambient lighting), this tech wasn't used in games back then, so there must be a simpler method to do this.
      Here is a link that shows how modern engines does it. Indirect Lighting Cache It would be nice if you know a paper that explains this technique. Can I apply this to quake 3' s light map generator and bsp format ?
  • Popular Now