OpenGL/Empat subwindows

Daripada Wikibooks

Penerangan kod sumber bagi 4 Subwindows

#include <GL/glut.h>  // fail header untuk GLUT
#include <stdio.h>  // fail header untuk stdio

#define GAP 10

int main_w, w1, w2, w3, w4;  // pengisytiharan setiap pembolehubah untuk mewujudkan 4 subwindows. 

void
display(void) // berfungsi untuk memaparkan set dan imej 
{
  glClear(GL_COLOR_BUFFER_BIT);  //menghilangkan latar belakang objek
  glFlush();  // berkuat kuasa pelaksanaan arahan GL dalam masa terhingg

}

void
vis(int visState)
{
  printf("VIS: win=%d, v=%d\n", glutGetWindow(), visState);
}

void
reshape(int w, int h)  // menentukan bentuk dan kedudukan objek dengan memberi nilai awal kepada 2 pembolehubah.

{
  int width = 50; // mengisytihar dan menetapkan nilai awal pada pembolehubah width
  int height = 50;  // mengisytihar dan menetapkan nilai awal pada pembolehubah height


  glViewport(0, 0, w, h);  // menentukan jarak serta ruang antara setiap subwindows
  if (w > 50) {
    width = (w - 3 * GAP) / 2;
  } else {
    width = 10;
  }
  if (h > 50) {
    height = (h - 3 * GAP) / 2;
  } else {
    height = 10;
  }

  glutSetWindow(w1);  // mewujudkan tetingkap yang pertama
  glutPositionWindow(GAP, GAP); //menentukan kedudukan tetingkap yang pertama
  glutReshapeWindow(width, height); // menentukan saiz dan juga bentuk tetingkap berdasarkan lebar dan tinggi objek


  glutSetWindow(w2);  // mewujudkan tetingkap yang kedua
  glutPositionWindow(GAP + width + GAP, GAP);  // menentukan kedudukan tetingkap kedua iaitu bertentangan tetingkap pertama
  glutReshapeWindow(width, height); // menentukan saiz dan juga bentuk tetingkap 

  glutSetWindow(w3); // mewujudakan tetingkap yang ketiga
  glutPositionWindow(GAP, GAP + height + GAP);  // menentukan kedudukan tetingkap ketiga, bersebelahan tetingkap pertama
  glutReshapeWindow(width, height); // menentukan saiz dan juga bentuk tetingkap 

  glutSetWindow(w4);  // mewujudkan tetingkap yang keempat
  glutPositionWindow(GAP + width + GAP, GAP + height + GAP); // kedudukan tetingkap keempat bertentangan tetingkap ketiga
  glutReshapeWindow(width, height);  // menentukan saiz dan juga bentuk tetingkap 

}

int
main(int argc, char **argv)  // pembolehubah argc mengandungi beberapa arguments yang diluluskan oleh program , manakala argv adalah petunjuk kepada argument.


{
  glutInit(&argc, argv);  // nilai awal glut dalam rangka kerja

  glutInitDisplayMode(GLUT_RGB);  // menyediakan mod paparan

  glutInitWindowSize(210, 210);  // menetapkan nilai awal pada saiz setiap subwindows

  main_w = glutCreateWindow("4 subwindows");  // mencipta 4 subwindows
  glutDisplayFunc(display);  // berfungsi untuk memaparkan setiap subwindows 
  glutVisibilityFunc(vis);  // keterlihatan fungsi untuk setiap objek
  glutReshapeFunc(reshape);  // menentukan bentuk dan saiz setiap subwindows
  glClearColor(1.0, 1.0, 1.0, 1.0);  // menetapkan warna bagi setiap subwindows

  w1 = glutCreateSubWindow(main_w, 10, 10, 90, 90);
  glutDisplayFunc(display);
  glutVisibilityFunc(vis);
  glClearColor(1.0, 0.0, 0.0, 1.0);
  w2 = glutCreateSubWindow(main_w, 110, 10, 90, 90);
  glutDisplayFunc(display);
  glutVisibilityFunc(vis);
  glClearColor(0.0, 1.0, 0.0, 1.0);
  w3 = glutCreateSubWindow(main_w, 10, 110, 90, 90);
  glutDisplayFunc(display);
  glutVisibilityFunc(vis);
  glClearColor(0.0, 0.0, 1.0, 1.0);
  w4 = glutCreateSubWindow(main_w, 110, 110, 90, 90);
  glutDisplayFunc(display);
  glutVisibilityFunc(vis);
  glClearColor(1.0, 1.0, 0.0, 1.0);

  glutMainLoop();  // proses pengulangan looping
  return 0;             /* ANSI C memerlukan laman utama untuk mengembalikan int. */

}