dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

glfw + gl + classes

 
dev.gamez.lv Forum Index -> OpenGL
View previous topic :: View next topic  
Author Message
^suny^



Joined: 30 Nov 2007
Posts: 57

PostPosted: Wed Dec 30, 2009 9:17 pm    Post subject: glfw + gl + classes

Te tāda lieta, es sāku dalīt programmu pa klasēm (urāā), agrāk nebiju to sapratis, bet tagad itkā jau saprotu. Tāpēc mēgināju uzrakstīt prastu OpenGL programmu ar GLFW kura lietotu manis izveidoto klasi. Tik tālu, tik labi, bet kad mēginu rotēt zīmējumu tad tas kvadrāts bezgalīgi mirgo Sad .

1. Vai vispār ir labi taisīt to, kā es to izdarīju ?
2. Un vai glfw ir līdzīga funkcija kā glutReshapeFunc(vai kaut kā tā), lai norādīt kurā gadījumā vinjam jādara renderer->Resize(); , ja nē kā to var izdarīt?

Code:

//Render.h//

#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glfw.h>

class render{
      public:
             render();
             virtual ~render();
             void Initialize(GLvoid);
             GLvoid Resize(GLsizei width, GLsizei height);
             void Draw(GLvoid);
};



Code:

//Render.cpp//

#include "Render.h"

#pragma warning(disable:4305)

render::render()
{
}

render::~render()
{
}

void render::Draw(GLvoid)
{
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   
     glBegin(GL_QUADS);
     glColor3f(1.0, 0.0, 0.0);   
       glVertex3f(-1.0, -1.0, 0.0);
       glVertex3f(1.0, -1.0, 0.0);
       glVertex3f(1.0, 1.0, 0.0);
       glVertex3f(-1.0, 1.0, 0.0);
     glEnd();     
}

void render::Initialize(GLvoid)
{
      if (glfwInit() != GL_TRUE)
      glfwTerminate();
     
      if (glfwOpenWindow(800, 600, 5, 6, 5, 0, 0, 0, GLFW_WINDOW) != GL_TRUE)
      glfwTerminate();
     
      glfwSetWindowTitle("Test");
      glfwEnable( GLFW_STICKY_KEYS );

     
      glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
      glClearDepth( 1.0f );
      glEnable( GL_DEPTH_TEST );
      glDepthFunc( GL_LEQUAL );
      glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
      glScalef(0.5, 0.5, 1.0);
}

GLvoid render::Resize(GLsizei width, GLsizei height)
{
       if (height < 1) height = 1;
       glfwGetWindowSize( &width, &height );

       glViewport(0, 0, width, height);
       glMatrixMode(GL_PROJECTION);
       glLoadIdentity();   
       gluPerspective(52.0f, 1.3f, 1.0f, 1000.0f);
       glMatrixMode(GL_MODELVIEW);
       glLoadIdentity();         
}




Code:

//Main.cpp//


#include "Render.h"

render *renderer;

void Main_Loop();

int main()
{
    renderer = new render();
    renderer->Initialize();
    Main_Loop();
}

void Main_Loop()
{
  while(bool isActive = true)
  {                 
    if (glfwGetKey(GLFW_KEY_ESC) == GLFW_PRESS)
    {
      glfwTerminate();
      isActive = false;
      break;
    }
   
   glfwSwapBuffers();
   renderer->Draw();   

  }
}
 



_________________
Back to top
View user's profile
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Wed Dec 30, 2009 10:10 pm    Post subject:

Quote:
bet tagad itkā jau saprotu

Tad pasaki, kāda jēga šeit kaut ko klasēs dalīt? Ne tev klasēs stāv dati, ne klasēm ir īpašs no tipa atkarīgs uzdevums (piemēram mantota klase, kura lietotu citu API)... Un kāda vispār jēga dinamiskajā atmiņā taisīt klasi, kura nekādus mainīgos nesatur?
Šeit var lietot vienkāršas funkcijas (Initialize, Resize, Draw) un būs pat labāk. Tāpēc uz pirmo jautājumu atbilde ir - <nē>.
Un 2. - glfw'am dokumentācija klāt nebija?

Un tev ar to kvadrātu ir problēmas vai nav?
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
^suny^



Joined: 30 Nov 2007
Posts: 57

PostPosted: Wed Dec 30, 2009 10:18 pm    Post subject:

Problēma ir tikai 1 kad es izsaucu glRotatef tad vinsh mirgo, tūlīt pārtaisīshu visu, tad pierakstīšu. Pasaki tikai, lūdzu kuros gadījumos noteikti ir ļoti izdevīgi veidot savu klasi? Piem, vektori, nē ?
_________________
Back to top
View user's profile
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Wed Dec 30, 2009 10:32 pm    Post subject:

Gan jau tāpēc mirgo, ka rotē pārāk ātri un ap nepareizo asi vai arī tu strādā ar nepareizo matricu. Par maz informācijas, tāpēc tikai minējumi..
Un par klašu lietošanu labāk konsultējies ar kādu no C++ lietošanas grāmatām. Es to visu paturēt galvā nevaru (vismaz ne viegli pieejamā veidā)... Smile
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
^suny^



Joined: 30 Nov 2007
Posts: 57

PostPosted: Wed Dec 30, 2009 10:58 pm    Post subject:

Jā pieliku glLoadIdentity() tagad rotē, bet ne tā ka vajag.
Šādam iznākuman nav jābūt ... : ( Pietam vēl glTranslatef arī gļuko

http://yy.lv/download.php?f=95177
_________________
Back to top
View user's profile
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Wed Dec 30, 2009 11:41 pm    Post subject:

Tu nenorādīji asi, ap kuru griezt to trijstūri. Ap nulles vektoru neko neapgriezīsi. http://www.opengl.org/sdk/docs/man/xhtml/glRotate.xml
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
^suny^



Joined: 30 Nov 2007
Posts: 57

PostPosted: Wed Dec 30, 2009 11:51 pm    Post subject:

Uj, aizmirsu pielikt, bet vienalga programma jauc x ar y.
ja rakstīt glRotatef(180.0f, 1.0f, 0.0f, 0.0f); tad trijstūris būs tāds

\-------/
-\-----/
--\---/
--..V

Apgāzts otrādi pa Y asi nevis X.
_________________
Back to top
View user's profile
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Wed Dec 30, 2009 11:56 pm    Post subject:

Programma neko nejauc. Tu pats tai iedevi modelview / projection matricas. Pēc tām tad arī nosaka, kas ir kurā pusē uz ekrāna.
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Thu Dec 31, 2009 11:22 am    Post subject:

suny: kā jau šņaks stāsta - no klasēm nav jēgas, ja tu neizmanto to iespējas - enkapsulēt datus (klašu memberus), vai to īpašības (piemēram, automātisku konstruktora/destruktora izsaukšanu).

Savā klasē sistēmā tev ir pilnīgi bezjēdzīga Initialize funkcija. Klasēm inicializāciju veid konstruktors, kas tiek automātiski izsaukts. Tb - tev nav jāuztraucās vai pats aizmirsīsi vai nē izsaukt to. Kompilators pats izsauks, līdzko instancēsi klases objektu.
Tas pats ar destruktoru - tajā vajag ielikt glfwTerminate() funkciju, kas izsauksies automātiski līdzko objekts tiks dzēsts. Nebūs pašam par to jāraizējas.
Par objekta dzēšanu - tu main funkcijā izveido klases instanci (renderer) dinamiskajā atmiņā, taču neatbrīvo to (ar delete). Vai nu dari to, vai arī vienkārši neizmanto dinamisko atmiņu. render klase nav tik milzīga, lai neielīstu stekā:
Code:
int main()
{
    render r;
    Main_Loop();
}

Un vēl - Main_Loop pataisi labāk par render klases metodi. Citādi no tā tava OOP paliek maz jēgas, tad jau tiešam labāk lieto vienkārši globālas funkcijas neimspeisā.

Pēc glfwTerminate izsaukšas nav vēlams izsaukt citas glfw funkcijas. Tās novedīs pie sliktas programmas darbības (labākajā gadījumā - tās kraša). Tu to dari, ja glfwOpenWindow atgriež GL_FALSE, taču no programmas neizej - tu turpini parastu tās darbību.

Kura tavuprāt tev ir X un kura Y ass? Vai tu esi apskatījis kāda ir defaultā OpenGL koordināšu sistēma? Pats tu nejauc tās? Kā tu gribi dabūt to trijstūri vispār?
Back to top
View user's profile Send e-mail
Display posts from previous:   
dev.gamez.lv Forum Index -> OpenGL All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group