Thursday, July 7, 2011

Mapping Texture (Raw image) into Object

//fstream declaration
//glut header declaration

GLuint texture; //as global variable

//function only works for RAW format image
GLuint loadtex(const char *filename, int w, int h)  //unasigned integer
{
    GLuint tex;
    FILE *file;
    unsigned char *data;
   
    file=fopen(filename,"rb");
    if(file==NULL) return 0;
   
    //preparation
    data=(unsigned char *)malloc(w*h*3);
    fread(data,w*h*3,1,file);
    fclose(file);

    //generate texture name
    glGenTextures(1,&tex);
    glBindTexture(GL_TEXTURE_2D,tex);

    //texture environment
    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);

    //set texture environment parameters
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);

    //connect data to GL_TEXTURE_2D
    glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,w,h,0,GL_RGB,GL_UNSIGNED_BYTE,data);
    free(data);

    return tex;
}

void renderscene()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    gluLookAt(0,0,-3,0,0,0,0,1,0);

    //enable
    glEnable(GL_TEXTURE_2D); //activate the texture
    glBindTexture(GL_TEXTURE_2D,texture);  //bind the texture   

    //do something
    glBegin(GL_QUADS);
        glTexCoord2f(0,0);
        glVertex2f(0,0);
        glTexCoord2f(1,0);
        glVertex2f(1,0);
        glTexCoord2f(1,1);
        glVertex2f(1,1);
        glTexCoord2f(0,1);
        glVertex2f(0,1);
    glEnd();
    glutSwapBuffers();
}

void reshape(int w, int h)
{
    glViewport(0,0,(GLsizei)w,(GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60,(GLfloat)w/(GLfloat)h,1.0,100.0);
    glMatrixMode(GL_MODELVIEW);   
    glLoadIdentity();
}

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

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(200,200);
    glutInitWindowSize(500,500);
    glutCreateWindow("Texture Example");
   
    glutDisplayFunc(renderscene);
    glutReshapeFunc(reshape);   
    glutKeyboardFunc(keypress);   

    texture=loadtex("texture.raw",256,256);
    glutMainLoop();
    glDeleteTextures(1,&texture); //reclean the memory and under glutMainLoop()
    return(0);
}

Wednesday, July 6, 2011

Create Text using Function

Just replace the ASCII code character codes with below function =) Simple and more effective!

void placetext(float x, float y, float z, void *font, char *string)
{
    char *c;
    glRasterPos3f(x,y,z);
    for(c=string; *c!='\0'; c++)
    {
        glutBitmapCharacter(font,*c);
    }
}

and replace your codes at display( ) function with;

placetext(0,0,0,GLUT_BITMAP_HELVETICA_18,"Hai Fiza!!");

My first ASCII Text using OpenGL

//OpenGL include goes here

GLfloat year=0;
GLfloat day=0;

void reshape(int w, int h)
{
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60,1,0.5,400);
    glMatrixMode(GL_MODELVIEW);   
    glLoadIdentity();
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glLoadIdentity();

    glRasterPos2f(0,0);
    //glRasterPos3f(0,1,0);
    glutBitmapCharacter(GLUT_BITMAP_9_BY_15,72);   
    glutBitmapCharacter(GLUT_BITMAP_9_BY_15,65);   
    glutBitmapCharacter(GLUT_BITMAP_9_BY_15,70);
    glutBitmapCharacter(GLUT_BITMAP_9_BY_15,73);
    glutBitmapCharacter(GLUT_BITMAP_9_BY_15,90);
    glutBitmapCharacter(GLUT_BITMAP_9_BY_15,65);
    glutBitmapCharacter(GLUT_BITMAP_9_BY_15,72);
   
    gluLookAt(0,0,-2,0,0,0,0,1,0);
    glutSwapBuffers();
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(100,100);
    glutCreateWindow("Text Example");
   
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);   

    glutMainLoop();
    return(0);
}

Create List and Spot Light

//OpenGL header file include goes here........................

GLuint list=1;

void reshape(int w, int h)
{
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluPerspective(60,1,0.5,400);

    glMatrixMode(GL_MODELVIEW);   
    glLoadIdentity();
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);

    gluLookAt(0,3,-20,0,0,0,0,1,0);

     //prepare lighting
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);
        glEnable(GL_COLOR_MATERIAL);
        GLfloat  lightPos[] = {0.0f, 50.0f, 0.0f, 0.0f };
        glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
        glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,lightPos);
   
    // Draw lantai
    glColor3f(0, 1, 0);
    glBegin(GL_QUADS);
    glVertex3f(-6, -0.8, -10);
    glVertex3f(-10, -0.8,  10);
    glVertex3f( 10, -0.8,  10);
    glVertex3f( 6, -0.8, -10);
    glEnd();

    glNewList(list,GL_COMPILE);   
        // Draw Head
        glColor3f(1,1,0);
        glutSolidSphere(1,12,12);
        glTranslatef(0,1,0);
        glColor3f(1,0,0);
        glutSolidCone(0.3,3,8,5);       
        //the eyes
        glPushMatrix();
        glColor3f(0,0,0);
        glTranslatef(0.5, -0.8, 1);
        glutSolidSphere(0.1,10,10);
        glTranslatef(-1, 0, 0);
        glutSolidSphere(0.1,10,10);
        glPopMatrix();
    glEndList();

    //duplicate call of list
    for(int x=-4; x<=4; x+=4)
    for(int z=-5; z<=10; z+=5)
    {
        glPushMatrix();
        glTranslatef(x,0,z);
        glCallList(list);
        glPopMatrix();
    }
    glLoadIdentity();
    glutSwapBuffers();
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(500,500);
    glutCreateWindow("List Example");
   
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);

    glutMainLoop();
    return(0);
}

Then the result... alamak ayam sy terbalik....

Turn On and Off the Light

//code for include glut header  goes here

void createcube(float,float,float); //function declaration

void display()
{
    //clearing
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //set type of display and depth color
    glEnable(GL_DEPTH_TEST);

    gluLookAt(-3,2,-10,0,0,0,0,2,0);

    createcube(-2,0,0);
    createcube(2,0,0);
    createcube(2,0,0);
    createcube(0,0,2);
    createcube(-2,0,0);
    createcube(-2,0,0);
       
    glutSwapBuffers();
    glLoadIdentity();
}

void createcube(float x, float y, float z)
{
    glTranslatef(x,y,z);
    glutSolidCube(1);   
}

void reshape(int w, int h)
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0,0,w,h);
    gluPerspective(45,1,0.1,1000);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void keypress(unsigned char key, int x, int y)
{
    //int mod;

    //mod=glutGetModifiers();
    if (key == 27) {exit(0); }
    if (key == 'a')
    {
        //prepare lighting
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);

        //light position
        GLfloat lightpos[]={-2,3,-3,1};
        glLightfv(GL_LIGHT0, GL_POSITION, lightpos);

        //light color
        GLfloat lightcolor[]={1,1,0};
        glLightfv(GL_LIGHT0, GL_DIFFUSE, lightcolor);
       
        //light ambient
        GLfloat ambcolor[]={1.5,0.8,0.4};
        glLightfv(GL_LIGHT0, GL_AMBIENT, ambcolor);
    }
    glutPostRedisplay();
    else if (key == 's')
    {
        glDisable(GL_LIGHT0);       
    }
    glutPostRedisplay();
    else if (key == 'd')
    {
        //change color   
        //prepare lighting
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);

        //light position
        GLfloat lightpos[]={-2,3,-3,1};
        glLightfv(GL_LIGHT0, GL_POSITION, lightpos);

        //light color
        GLfloat lightcolor[]={0,0,1};
        glLightfv(GL_LIGHT0, GL_DIFFUSE, lightcolor);
       
        //light ambient
        GLfloat ambcolor[]={0,0.8,0.4};
        glLightfv(GL_LIGHT0, GL_AMBIENT, ambcolor);
    }
    glutPostRedisplay();
   
}


int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutInitWindowPosition(100,100);
    glutInitWindowSize(500,500);
    glutCreateWindow("Exercise 1 Lighting");

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keypress);
   
    glutMainLoop();
    return 0;
}

Tuesday, July 5, 2011

Creating Movement Using Keyboard Function

// glut.h include codes goes here

float angle=0.0, ratio;
float eyeY=1.5f;
float r=1,g=1,b=1;
bool movetoggle=false, buttondown=false;
int w, h;

//define function declaration
void display();
void viewobject();
void reshape(int,int);
void keypress(unsigned char,int,int);

void display()
{
    glClearColor(0,0,0,1); //set output to alpha color
    glClear(GL_COLOR_BUFFER_BIT); //set type of display color
    viewobject(); // call object gluLookAt thru viewobject() function
    glTranslatef(0,0,-2);
    glColor3f(r,g,b);   
    glutWireCube(2);

    glutSwapBuffers();
    glLoadIdentity();

}

void viewobject()
{
    gluLookAt(0,eyeY,5,0,0,0,0,1,0);
}

void reshape(int w1, int h1)
{
    if(h1 == 0) h1=1;

    w=w1; h=h1;
    ratio=1.0f * w/h ;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0,0,w,h);
    gluPerspective(45,ratio,0.1,1000);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void keypress(unsigned char key, int x, int y)
{
    int mod;

    mod=glutGetModifiers();
    if (key == 27) {exit(0); }
    if (key == 13)
    {
        if((mod==GLUT_ACTIVE_CTRL) && !movetoggle)
            movetoggle=true;
        else
            movetoggle=false;
    }
    glutPostRedisplay();
}

void keyspecial(int key, int x, int y)
{
    if(key==GLUT_KEY_UP)
    {
        if(movetoggle)
        {
            eyeY+=0.1;
        }
    }
    if(key==GLUT_KEY_DOWN)
    {
        if(movetoggle)
        {
            eyeY-=0.1;
        }
    }
    if(key==GLUT_KEY_F1)
    {
        r=1.0f,g=0.0f,b=0.0f;
    }
    if(key==GLUT_KEY_F2)
    {
        r=01.0f,g=1.0f,b=0.0f;
    }
    if(key==GLUT_KEY_F3)
    {
        r=0.0f,g=0.0f,b=1.0f;
    }
    glutPostRedisplay();
    /* switch(key){
    case GLUT_KEY_F1 : red = 1.0; green = 0.0; blue = 0.0; break;
    case GLUT_KEY_F2 : red = 0.0; green = 1.0; blue = 0.0; break;
    case GLUT_KEY_F3 : red = 0.0; green = 0.0; blue = 1.0; break;
    }*/
}

void mouseclick(int button, int state, int x, int y)
{
    if (button==GLUT_LEFT_BUTTON && state==GLUT_DOWN && movetoggle)
        buttondown=true;
    else
        buttondown=false;
}

void mousemove(int x, int y)
{
    int mid=h/2;
    if(buttondown)
    {
        if(y>mid){
            eyeY-=0.1f;}
        else{
            eyeY+=0.1f;
        }
    }
    glutPostRedisplay();
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(320,320);
    glutCreateWindow("Exercise 2");

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keypress);
    glutSpecialFunc(keyspecial);
    glutMouseFunc(mouseclick);
    glutMotionFunc(mousemove);

    glutMainLoop();
    return 0;
}

Thursday, March 24, 2011

Creating Simple Rainbow

Dear students,

I'm away from office tomorrow. Enjoy creating your own pattern design (DTP DNS3A). I'm so proud to all of you... Try your best to improve your skills in design.

Now, presenting you how to make simple rainbow using Warp function...

Download now Lab 8: Activity 3 - Creating Simple Rainbow using Warp.


Next, insyaAllah i will upload more interesting activities in 3D design. =) All the best for your final exam!



Wednesday, January 12, 2011

Peperiksaan itu Amanah, Jadi Janganlah Meniru

Assalamualaikum dan salam sejahtera,

Pelajar-pelajar yang dikasihi...

Just short reminder for all of you. Please read below article... Quiz, Test and Assignment. Semua tu adalah amanah. Amanah ibu bapa / penjaga awak kepada anak-anaknya. Kenapa mesti memberi tiru atau meniru??? Bukankah lebih gembira kalau kejayaan itu dimiliki hasil usaha sendiri? Tidak malu kah pada amanah ibu bapa?? Jujurlah pada diri sendiri...

Everyone make mistakes. Tapi setiap kesilapan pasti ada pembalasan sebagai pengajaran untuk masa depan. Renung-renungkan. Saya ucapkan tahniah kepada yang berjaya "AMANAH" pada diri sendiri. Walaupun markah yang awak dapat tidak seberapa, ia lebih baik dan berkat daripada markah perlakuan meniru awak. Dan lebih baik daripada 0.

All the best for all my students....


"Anda dilarang membuka kertas soalan sehingga diberitahu"

"Masa menjawab telah tamat, sila letakkan pen dan pensel, anda dilarang bersuara sebelum keluar dewan."

Ayat-ayat ini nampaknya biasa semasa dalam ujian atau peperiksaan. Juga dikenali sebagai test atau exam. Sebaik sahaja duduk di kerusi masing-masing, terpapar pada muka hadapan soalan yang melarang kita membuka kertas soalan itu sehingga diberitahu. Namun, masih ada jari-jari nakal yang menyelak kertas soalan tersebut sebelum tempoh menjawab bermula. Setelah menyelak, mulalah bertanya rakan sebelah tentang apa yang telah dibaca. Kalau tidak dapat tanya semua, secubit rasa pun jadilah. Inilah permulaan kepada perbuatan meniru dalam peperiksaan!

Peperiksaan merupakan ruang yang cukup jelas untuk kita selaku penuntut ilmu mengukur tahap penguasaan ilmu sesuatu bidang. Benar, kita ke kuliah setiap hari dan mengangguk faham apa yang diajar pensyarah. Sekiranya semuanya mengangguk kepala, adakah pensyarah itu pasti semua yang mengangguk itu faham apa yang diajar? Mungkin juga dalam ramai-ramai penuntut itu ada yang mengangguk kerana mengantuk. Satu sudut pula, betulkah kita benar-benar faham apa yang sedang dipelajari dan sejauh mana kita mampu menghayati dan mengingati ilmu tersebut untuk dipraktik di alam pekerjaan nanti?

Inilah kelebihan adanya peperiksaan. Peperiksaan menjadi medan bagi ujian kefahaman, daya ingatan, kreativiti dan penjawab soalan terpaksa berfikiran kritikal untuk menjawab soalan. Adakalanya tekanan membuatkan kita lebih alert dan meningkatkan potensi untuk mengembangkan minda kita. Inilah yang berlaku semasa menjawab peperiksaan.

Malangnya, setelah tamat menjawab, pemikiran kritikal tadi berubah menjadi pasif. Soalan-soalan tadi dilupakan, isi-isi yang diingat ketika mengulangkaji pudar seperti air yang penuh dalam bekas tertumpah dek kerana goncangan. Harap ini tidaklah terjadi kepada kita semua.

Rugi dan memang rugi kalau apa yang kita belajar semata-mata untuk peperiksaan lalu dibuang setelah tamat menjawab seperti peribahasa 'habis manis, sepah dibuang'. Oleh itu, sebenarnya saya ingin membawa kepada satu persoalan yang cukup penting berkaitan peperiksaan atau ujian iaitu BUDAYA MENIRU.

Meniru dalam peperiksaan seakan-akan hal yang nampak remeh namun sedarkah kita bahawa dengan meniru, kita telah menipu diri sendiri. Lebih rugi lagi, setelah kita menipu diri sendiri, kita tertipu pula dengan keputusan yang mantap-mantap setiap ujian. Natijahnya, benarkah semua penerima anugerah senarai kepujian Naib Canselor dan Dekan itu layak dinobatkan sebagai penerima anugerah? Tidak dinafikan, dalam kalangan mereka terdapat yang bersungguh-sungguh dan jujur terhadap diri sendiri ketika peperiksaan dengan cara tidak meniru. Namun, selebihnya pula bagaimana berjaya? Rakaman suara? Nota kecil? Nota yang disorok dalam tandas? 'Toyol'? Nah! mereka yang rasa pernah melakukan perbuatan 'menjerat diri sendiri' semasa peperiksaan ini, silalah renungkan.

Saya ingin bawa kepada aspek kerohanian pula. Setelah persoalan-persoalan yang ditujahkan tadi, cuba tanya diri sendiri untuk apakah mendapat result yang baik dengan cara meniru? Target anda nanti mahu jadi boss? berkereta mewah? berumah banglo? memiliki orang gaji? memiliki syarikat sendiri? Kalau begitu, tanggapan saudara/saudari perlu diperbetulkan. Kita boleh memiliki semua itu, namun adakah kita mencapai ketenangan hidup kalau mendapat semua yang diinginkan itu? Semuanya bermula daripada keputusan peperiksaan cemerlang disebabkan oleh meniru, mendapat pekerjaan dan jadi kaya. Sekali lagi persoalan, yakinkah kita akan tenang dengan cara itu?

Itupun kalau riwayat hidup kita beruntung mendapat apa yang kita inginkan. Kalau malang tidak berbau, kita akan terasa seperti orang bodoh kerana ketika menempuh alam pekerjaan, dalam keadaan yakin dengan keputusan peperiksaan dahulu, tetapi rupa-rupanya kita tidak mampu menempuh pekerjaan yang mencabar itu. Kita tertipu gara-gara meniru dahulu.

Oleh itu, inilah dikatakan KEBERKATAN. Sebenarnya, dalam setiap perkara yang kita lakukan, pastikan ianya membawa keberkatan hidup. Kalau kita seorang pekerja, beramanahlah dengan pekerjaan itu. Kalau kita seorang pemimpin, hendaklah bersikap adil kepada orang bawahan. Dan kalau kita seorang penuntut ilmu, maka jujurlah dalam menuntut ilmu. Maksudnya, buatlah apa jua pekerjaan tetapi solat jangan ditinggalkan, aurat hendaklah dijaga dan jujur terhadap diri sendiri dan orang lain. Semua ini berkait dengan BERKAT.

Berkat itu tidak dapat disentuh, tetapi dapat dirasakan iaitu petandanya, rezeki yang tidak banyak dirasakan cukup. Kerja yang terbeban, dapat diselesaikan dengan sempurna. Orang lain meminta tolong, kita dapat tunaikan. Banyak lagi petanda-petanda berkat itu. Berkat juga boleh dilihat dengan hati nurani (mata hati/ basiroh).

Namun, kita masih belum nampak lagi semua itu sekarang. Oleh itu, semasa peperiksaan jujurlah pada diri sendiri. Kalau pengawas peperiksaan tak nampak sekali pun, Tuhan yang Maha Melihat dan Maha Mengetahui memerhati. Kita perlu khuatir, kerana peperiksaan itu suatu amanah maka sudah tentu akan dihisab di akhirat. Andai amanah itu tidak dijalankan sejujurnya, na'udzubillah, itulah akibat daripada perbuatan kita di dunia.

Kesimpulannya, ketika menjawab peperiksaan jangan sesekali meniru dan biar ditiru. Elakkan mengambil kesempatan di atas kebaikan pengawas peperiksaan. Hal ini kerana berkait rapat dengan BERKAT dan AMANAH yang bakal dihisab di akhirat. Andai itu jalannya, maka kita menipu ibu bapa, diri sendiri, pensyarah tetapi Tuhan kita tidak dapat tipu. Maka berseronoklah dengan keputusan hasil plagiarism itu sementara menanti nasib mendatang yang belum pasti. Anda mampu mengubahnya.

"Masa untuk meniru telah tamat, sila letakkan kejujuran dalam diri anda"

Question 1: Introduction to Variable

Based on code below, create a dynamic program that solve problem below: Source Code: #include <iostream> using na...