Untitled

mail@pastecode.io avatar
unknown
plain_text
7 days ago
5.5 kB
6
Indexable
Never
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <iostream>

// Variabel untuk menyimpan ID tekstur
GLuint textureHouseID;
GLuint textureDoorID;
GLuint textureWindowID;
GLuint textureRoofID;

GLfloat yOffset = -0.3f;  // Nilai negatif untuk menggeser rumah ke bawah


// Fungsi untuk memuat tekstur dengan tambahan parameter wrapping
GLuint loadTexture(const char* filename, GLenum format, GLenum wrapMode) {
    int width, height, nrChannels;
    unsigned char* data = stbi_load(filename, &width, &height, &nrChannels, 0);

    if (data) {
        GLuint textureID;
        glGenTextures(1, &textureID);
        glBindTexture(GL_TEXTURE_2D, textureID);

        // Gunakan format yang sesuai
        glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);

        // Atur wrapping ke GL_CLAMP_TO_EDGE untuk mencegah stretch
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapMode);  // Sumbu X
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapMode);  // Sumbu Y

        // Set filter untuk scaling
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

        glGenerateMipmap(GL_TEXTURE_2D);

        stbi_image_free(data);
        return textureID;
    }
    else {
        std::cout << "Failed to load texture: " << stbi_failure_reason() << std::endl;
        return 0;
    }
}

// Fungsi untuk menggambar kotak bertekstur
// Variabel global untuk menggeser rumah ke bawah

// Fungsi untuk menggambar kotak bertekstur dengan offset
void drawTexturedBox(GLuint textureID, float x, float y, float width, float height, float texRepeatX = 1.0f, float texRepeatY = 1.0f) {
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, textureID);

    glBegin(GL_QUADS);
    // Pastikan pengaturan UV mapping tidak menyebabkan stretch
    glTexCoord2f(0.0f, texRepeatY); glVertex2f(x, y + yOffset);                  // Kiri bawah
    glTexCoord2f(texRepeatX, texRepeatY); glVertex2f(x + width, y + yOffset);     // Kanan bawah
    glTexCoord2f(texRepeatX, 0.0f); glVertex2f(x + width, y + height + yOffset);  // Kanan atas
    glTexCoord2f(0.0f, 0.0f); glVertex2f(x, y + height + yOffset);                // Kiri atas
    glEnd();

    glDisable(GL_TEXTURE_2D);
}

void drawTexturedRoof(GLuint textureID, GLfloat roofWidth, GLfloat roofHeight) {
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, textureID);

    glBegin(GL_TRIANGLES);
    // Atur UV mapping dan koordinat vertex segitiga
    glTexCoord2f(0.0f, 0.0f); glVertex2f(-roofWidth / 2.0f, 0.5f + yOffset);  // Kiri bawah
    glTexCoord2f(1.0f, 0.0f); glVertex2f(roofWidth / 2.0f, 0.5f + yOffset);   // Kanan bawah
    glTexCoord2f(0.5f, 1.0f); glVertex2f(0.0f, 0.8f + roofHeight + yOffset);  // Puncak segitiga (tengah atas)
    glEnd();

    glDisable(GL_TEXTURE_2D);
}
// Fungsi untuk menggambar atap segitiga dengan offset
void drawRoof(GLfloat roofWidth, GLfloat roofHeight) {
    // Set warna atap (misalnya merah)
    glColor3f(1.0f, 0.0f, 0.0f);  // Warna merah untuk atap

    glBegin(GL_TRIANGLES);
    // Koordinat vertex segitiga untuk atap dengan offset Y
    glVertex2f(-roofWidth / 2.0f, 0.5f + yOffset);  // Kiri bawah
    glVertex2f(roofWidth / 2.0f, 0.5f + yOffset);   // Kanan bawah
    glVertex2f(0.0f, 0.8f + roofHeight + yOffset);  // Puncak segitiga (tengah atas)
    glEnd();

    // Kembalikan warna ke default (putih) untuk objek lain
    glColor3f(1.0f, 1.0f, 1.0f);  // Kembalikan warna ke putih
}

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

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    // Gambar rumah dengan tekstur, digeser ke bawah
    drawTexturedBox(textureHouseID, -0.5f, -0.5f, 1.0f, 1.0f);

    // Gambar pintu dengan tekstur, digeser ke bawah
    drawTexturedBox(textureDoorID, -0.1f, -0.5f, 0.2f, 0.4f);

    // Gambar jendela kiri dan kanan, digeser ke bawah
    drawTexturedBox(textureWindowID, -0.4f, 0.1f, 0.2f, 0.3f);
    drawTexturedBox(textureWindowID, 0.2f, 0.1f, 0.2f, 0.3f);

    // Gambar atap (segitiga) dengan tekstur
    drawTexturedRoof(textureRoofID, 1.5f, 0.3f);

    glDisable(GL_BLEND);
    glutSwapBuffers();
}
int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowSize(800, 600);
    glutCreateWindow("OpenGL Textured House with Textured Roof");

    GLenum err = glewInit();
    if (GLEW_OK != err) {
        std::cerr << "Error: " << glewGetErrorString(err) << std::endl;
        return 1;
    }

    // Muat tekstur dengan wrapping berbeda
    textureHouseID = loadTexture("D:/ProgramFiles/VisualStudioProjek/Home/Debug/base.png", GL_RGBA, GL_CLAMP_TO_EDGE);    // Tekstur rumah
    textureWindowID = loadTexture("D:/ProgramFiles/VisualStudioProjek/Home/Debug/jendela.jpg", GL_RGB, GL_CLAMP_TO_EDGE); // Tekstur jendela
    textureDoorID = loadTexture("D:/ProgramFiles/VisualStudioProjek/Home/telolet.png", GL_RGB, GL_CLAMP_TO_EDGE);         // Tekstur pintu
    textureRoofID = loadTexture("D:/ProgramFiles/VisualStudioProjek/Home/Debug/roof.jpg", GL_RGB, GL_CLAMP_TO_EDGE);      // Tekstur atap

    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}
Leave a Comment