Quellcode durchsuchen

Create Create_Custom_Cube_Mesh.c

Rudy Boudewijn van Etten vor 5 Jahren
Ursprung
Commit
1939862283
1 geänderte Dateien mit 340 neuen und 0 gelöschten Zeilen
  1. 340 0
      3D/Create_Custom_Cube_Mesh.c

+ 340 - 0
3D/Create_Custom_Cube_Mesh.c

@@ -0,0 +1,340 @@
+//
+// I took this from a example source and slapped it together.
+//
+// It kind of works...
+
+
+#include "raylib.h"
+#include "rlgl.h"
+#include <stdlib.h>
+#include <string.h>
+
+#define MAX_MESH_VBO 7
+
+static float *GetCubeVertices(float x, float y, float z);
+static float texcoordsRef[];
+static float normalsRef[];
+    
+int main(void)
+{
+    // Initialization
+    //--------------------------------------------------------------------------------------
+    const int screenWidth = 800;
+    const int screenHeight = 450;
+
+    InitWindow(screenWidth, screenHeight, "raylib example.");
+
+
+    // Define the camera to look into our 3d world
+    Camera camera = { 0 };
+    camera.position = (Vector3){ 10.0f, 10.0f, 10.0f }; // Camera position
+    camera.target = (Vector3){ 0.0f, 0.0f, 0.0f };      // Camera looking at point
+    camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };          // Camera up vector (rotation towards target)
+    camera.fovy = 45.0f;                                // Camera field-of-view Y
+    
+
+
+    SetCameraMode(camera, CAMERA_FIRST_PERSON);     // Set camera mode
+    //SetCameraMode(camera, CAMERA_ORBITAL);  // Set a orbital camera mode
+
+
+
+
+
+
+    Mesh mesh = {0};
+    mesh.vboId = (unsigned int *)RL_CALLOC(MAX_MESH_VBO, sizeof(unsigned int));
+    float *vertices = RL_MALLOC(36 * 3 * 1 * sizeof(float));
+    float *texcoords = RL_MALLOC(36 * 2 * 1 * sizeof(float));
+    float *normals = RL_MALLOC(36 * 3 * 1 * sizeof(float));
+
+    int verticesCount = 0;
+    int texcoordsCount = 0;
+    int normalsCount = 0;
+    
+    int x=0,y=0,z=0;
+    
+    float *blockVertices = GetCubeVertices(x, y, z);
+    for (int v = 0; v < 36 * 3; v++)
+    {
+        vertices[verticesCount + v] = blockVertices[v];
+    }
+    for (int t = 0; t < 36 * 2; t++)
+    {
+        texcoords[texcoordsCount + t] = texcoordsRef[t];
+    }
+    for (int n = 0; n < 36 * 3; n++)
+    {
+        normals[normalsCount + n] = normalsRef[n];
+    }
+    verticesCount += 36 * 3;
+    texcoordsCount += 36 * 2;
+    normalsCount += 36 * 3;    
+    
+
+    mesh.vertices = (float *)RL_MALLOC(verticesCount * sizeof(float));
+    memcpy(mesh.vertices, vertices, verticesCount * sizeof(float));
+
+    mesh.texcoords = (float *)RL_MALLOC(texcoordsCount * sizeof(float));
+    memcpy(mesh.texcoords, texcoords, texcoordsCount * sizeof(float));
+
+    mesh.normals = (float *)RL_MALLOC(normalsCount * sizeof(float));
+    memcpy(mesh.normals, normals, normalsCount * sizeof(float));
+
+    mesh.vertexCount = verticesCount / 3;         // fixme: Why divide by 3 ???
+    mesh.triangleCount = (verticesCount / 3) / 2; // fixme: Why divide by 3 and 2 ???
+
+    RL_FREE(vertices);
+    RL_FREE(texcoords);
+    RL_FREE(normals);
+
+    rlLoadMesh(&mesh, false);
+
+    Model worldModel = LoadModelFromMesh(mesh);
+
+
+    // We generate a checked image for texturing
+    Image checked = GenImageChecked(4, 4, 1, 1, RED, GREEN);
+    Texture2D texture = LoadTextureFromImage(checked);
+    UnloadImage(checked);
+    worldModel.materials[0].maps[MAP_DIFFUSE].texture = texture;
+
+    //worldModel.materials[0].maps[MAP_DIFFUSE].texture = LoadTexture("resources/grass.png");
+
+
+
+
+
+
+
+ 
+    SetTargetFPS(60);               // Set our game to run at 60 frames-per-second
+    //--------------------------------------------------------------------------------------
+
+    // Main game loop
+    while (!WindowShouldClose())    // Detect window close button or ESC key
+    {
+        // Update
+        //----------------------------------------------------------------------------------
+        UpdateCamera(&camera);      // Update internal camera and our camera
+
+        //----------------------------------------------------------------------------------
+        // Draw
+        //----------------------------------------------------------------------------------
+        BeginDrawing();
+
+            ClearBackground(RAYWHITE);
+
+            BeginMode3D(camera);
+
+            Vector3 pos;
+            pos.x = 9;
+            pos.y = 2;
+            pos.z = 13;
+            DrawModel(worldModel, pos, 1.0f, WHITE);
+
+            EndMode3D();
+            
+            DrawFPS(0,0);
+            
+
+        EndDrawing();
+        //----------------------------------------------------------------------------------
+    }
+
+
+    //--------------------------------------------------------------------------------------
+    UnloadModel(worldModel); 
+    UnloadTexture(texture); // Unload texture
+    CloseWindow();        // Close window and OpenGL context
+    //--------------------------------------------------------------------------------------
+
+    return 0;
+
+
+}
+
+static float texcoordsRef[] = {
+    // face 1
+    0.5f, 1.0f,
+    0.25f, 1.0f,
+    0.25f, 0.0f,
+
+    0.25f, 0.0f,
+    0.5f, 0.0f,
+    0.5f, 1.0f,
+
+
+    // face 2
+    0.25f, 1.0f,
+    0.25f, 0.0f,
+    0.5f, 0.0f,
+
+    0.5f, 0.0f,
+    0.5f, 1.0f,
+    0.25f, 1.0f,
+
+    // face 3 (top)
+    0.0f, 0.0f,
+    0.25f, 0.0f,
+    0.25f, 1.0f,
+
+    0.25f, 1.0f,
+    0.0f, 1.0f,
+    0.0f, 0.0f,
+
+    // face 4 (bottom)
+    0.0f, 0.0f,
+    0.25f, 0.0f,
+    0.25f, 1.0f,
+
+    0.25f, 1.0f,
+    0.0f, 1.0f,
+    0.0f, 0.0f,
+
+    // face 5
+    0.25f, 1.0f,
+    0.25f, 0.0f,
+    0.5f, 0.0f,
+
+    0.5f, 0.0f,
+    0.5f, 1.0f,
+    0.25f, 1.0f,
+
+    // face 6
+    0.5f, 1.0f,
+    0.25f, 1.0f,
+    0.25f, 0.0f,
+
+    0.25f, 0.0f,
+    0.5f, 0.0f,
+    0.5f, 1.0f,
+};
+
+static float normalsRef[] = {
+    // face 1
+    0.0f, 0.0f, 1.0f,
+    0.0f, 0.0f, 1.0f,
+    0.0f, 0.0f, 1.0f,
+
+    0.0f, 0.0f, 1.0f,
+    0.0f, 0.0f, 1.0f,
+    0.0f, 0.0f, 1.0f,
+
+    // face 2
+    0.0f, 0.0f, -1.0f,
+    0.0f, 0.0f, -1.0f,
+    0.0f, 0.0f, -1.0f,
+
+    0.0f, 0.0f, -1.0f,
+    0.0f, 0.0f, -1.0f,
+    0.0f, 0.0f, -1.0f,
+
+    // face 3
+    0.0f, 1.0f, 0.0f,
+    0.0f, 1.0f, 0.0f,
+    0.0f, 1.0f, 0.0f,
+
+    0.0f, 1.0f, 0.0f,
+    0.0f, 1.0f, 0.0f,
+    0.0f, 1.0f, 0.0f,
+
+    // face 4
+    0.0f, -1.0f, 0.0f,
+    0.0f, -1.0f, 0.0f,
+    0.0f, -1.0f, 0.0f,
+
+    0.0f, -1.0f, 0.0f,
+    0.0f, -1.0f, 0.0f,
+    0.0f, -1.0f, 0.0f,
+
+    // face 5
+    1.0f, 0.0f, 0.0f,
+    1.0f, 0.0f, 0.0f,
+    1.0f, 0.0f, 0.0f,
+
+    1.0f, 0.0f, 0.0f,
+    1.0f, 0.0f, 0.0f,
+    1.0f, 0.0f, 0.0f,
+
+    // face 6
+    -1.0f, 0.0f, 0.0f,
+    -1.0f, 0.0f, 0.0f,
+    -1.0f, 0.0f, 0.0f,
+
+    -1.0f, 0.0f, 0.0f,
+    -1.0f, 0.0f, 0.0f,
+    -1.0f, 0.0f, 0.0f};
+
+// note: Yes, the implementation of the world model is dirty.
+// todo: reimplement as chunks
+
+static float *GetCubeVertices(float x, float y, float z)
+{
+    // not using indices
+    float width = 1.0f;
+    float height = 1.0f;
+    float length = 1.0f;
+    float *cubeVertices = malloc(36 * 3 * sizeof(float));
+    float ref[] = {
+        // face 1
+        -width / 2 + x, -height / 2 + y, length / 2 + z,
+        width / 2 + x, -height / 2 + y, length / 2 + z,
+        width / 2 + x, height / 2 + y, length / 2 + z,
+
+        width / 2 + x, height / 2 + y, length / 2 + z,
+        -width / 2 + x, height / 2 + y, length / 2 + z,
+        -width / 2 + x, -height / 2 + y, length / 2 + z,
+
+        // face 2
+        -width / 2 + x, -height / 2 + y, -length / 2 + z,
+        -width / 2 + x, height / 2 + y, -length / 2 + z,
+        width / 2 + x, height / 2 + y, -length / 2 + z,
+
+        width / 2 + x, height / 2 + y, -length / 2 + z,
+        width / 2 + x, -height / 2 + y, -length / 2 + z,
+        -width / 2 + x, -height / 2 + y, -length / 2 + z,
+
+        // face 3
+        -width / 2 + x, height / 2 + y, -length / 2 + z,
+        -width / 2 + x, height / 2 + y, length / 2 + z,
+        width / 2 + x, height / 2 + y, length / 2 + z,
+
+        width / 2 + x, height / 2 + y, length / 2 + z,
+        width / 2 + x, height / 2 + y, -length / 2 + z,
+        -width / 2 + x, height / 2 + y, -length / 2 + z,
+
+        // face 4
+        -width / 2 + x, -height / 2 + y, -length / 2 + z,
+        width / 2 + x, -height / 2 + y, -length / 2 + z,
+        width / 2 + x, -height / 2 + y, length / 2 + z,
+
+        width / 2 + x, -height / 2 + y, length / 2 + z,
+        -width / 2 + x, -height / 2 + y, length / 2 + z,
+        -width / 2 + x, -height / 2 + y, -length / 2 + z,
+
+        // face 5
+        width / 2 + x, -height / 2 + y, -length / 2 + z,
+        width / 2 + x, height / 2 + y, -length / 2 + z,
+        width / 2 + x, height / 2 + y, length / 2 + z,
+
+        width / 2 + x, height / 2 + y, length / 2 + z,
+        width / 2 + x, -height / 2 + y, length / 2 + z,
+        width / 2 + x, -height / 2 + y, -length / 2 + z,
+
+        // face 6
+        -width / 2 + x, -height / 2 + y, -length / 2 + z,
+        -width / 2 + x, -height / 2 + y, length / 2 + z,
+        -width / 2 + x, height / 2 + y, length / 2 + z,
+
+        -width / 2 + x, height / 2 + y, length / 2 + z,
+        -width / 2 + x, height / 2 + y, -length / 2 + z,
+        -width / 2 + x, -height / 2 + y, -length / 2 + z};
+
+    for (int i = 0; i < 36 * 3; i++)
+    {
+        cubeVertices[i] = ref[i];
+    }
+    
+    return cubeVertices;
+}