Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h>
- #include <stdio.h>
- #include <immintrin.h>
- #include <math.h>
- #include <time.h>
- // Indice video for rotation's matrix
- #define BPP 4
- #define LENGTH 1920 // x
- #define WIDTH 1080 // y
- #define DEPTH 2000 // z
- #define PITCH screen_info[_x] * BPP
- #define DEG2RAD(angle) angle * (PI/180)
- #define RAPPORT (screen_info[_x]/screen_info[_y])
- #define DISTANCE 1000
- #define PI 3.14159265 // 32-bit precise
- // Standard color for rendering scene (copy through ColorPic program)
- #define WHITE 0x00FFFFFF
- #define BLACK 0x00000000
- #define RED 0x00FF0000
- #define GREEN 0x0000FF00
- #define BLUE 0x000000FF
- #define BLUE_SCENE 0x0000204D
- #define GREY_SCENE 0x001E1E22
- #define MAP_GRID_SCENE 0x00585858
- #define SELECT_OBJECT_SCENE 0x00FFA700
- // Indice for array
- #define _x 0
- #define _y 1
- #define _z 2
- #define _color 3
- #define _2x 4
- #define _2y 5
- #define _2z 6
- #define _2color 7
- #define _3x 8
- #define _3y 9
- #define _3z 10
- #define _3color 11
- #define _4x 12
- #define _4y 13
- #define _4z 14
- #define _4color 15
- #define _next 1
- #define _previous -1
- #define SHIFT_WHEELUP 7864324
- #define SHIFT_WHEELDOWN -7864316
- int FPS_COUNTER_DATA[2] = { 0 }; // 0: compteur_boucle & affiche_fps , 1: last_time
- int quit = 1;
- int offset_pixel = 0;
- int screen_info[2];
- int prev_coord_mouse[2];
- int last_key;
- float world_position[4];
- int repere;
- int speed_cam = 10;
- int screen[LENGTH*WIDTH] = { 0 };
- float voxel_cube[100 * 100 * 100 * 4];
- float voxel_map[1000 * 1000 * 4];
- HINSTANCE instance;
- HBITMAP texture;
- PAINTSTRUCT paint_struct;
- HDC device_context_screen;
- HDC device_context_texture;
- WNDCLASS windows_class;
- HWND windows_handle;
- HWND windows_handle_2;
- MSG event;
- LRESULT anwser;
- HICON icon_program;
- typedef union xmm
- {
- float v[4];
- __m128 xmm;
- }vector128;
- vector128 temp128;
- vector128 pixel_coord;
- vector128 sincosps_angle;
- vector128 obj_cos;
- vector128 obj_sin;
- vector128 cam_cos;
- vector128 cam_sin;
- vector128 pi_180;
- vector128 position_obj;
- vector128 angle_obj;
- vector128 repere_obj;
- vector128 angle_cam;
- vector128 repere_cam;
- vector128 position_cam;
- vector128 cam_x; // vector_right
- vector128 cam_y; // vector_up
- vector128 cam_z; // vector_forward
- typedef union ymm
- {
- float v[8];
- __m256 ymm;
- }vector256;
- vector256 temp256;
- void put_pixel(float *_obj)
- {
- float obj_end[4];
- float obj[4];
- obj[_x] = _obj[_x];
- obj[_y] = _obj[_y];
- obj[_z] = _obj[_z];
- obj[_x] += position_obj.v[_x];
- obj[_y] += position_obj.v[_y];
- obj[_z] += position_obj.v[_z];
- // Object Management
- // Rotate xyz
- obj_end[_x] = obj[_x] * ((obj_cos.v[_y] * obj_cos.v[_z])) - obj[_y] * ((obj_cos.v[_y] * obj_sin.v[_z])) - obj[_z] * (obj_sin.v[_y]);
- obj_end[_y] = obj[_x] * ((obj_cos.v[_x] * obj_sin.v[_z]) - (obj_sin.v[_x] * obj_sin.v[_y] * obj_cos.v[_z])) + obj[_y] * ((obj_sin.v[_x] * obj_sin.v[_y] * obj_sin.v[_z]) + (obj_cos.v[_x] * obj_cos.v[_z])) - obj[_z] * (obj_sin.v[_x] * obj_cos.v[_y]);
- obj_end[_z] = obj[_x] * ((obj_cos.v[_x] * obj_sin.v[_y] * obj_cos.v[_z]) + (obj_sin.v[_x] * obj_sin.v[_z])) + obj[_y] * ((obj_sin.v[_x] * obj_cos.v[_z]) - (obj_cos.v[_x] * obj_sin.v[_y] * obj_sin.v[_z])) + obj[_z] * (obj_cos.v[_x] * obj_cos.v[_y]);
- obj[_x] = obj_end[_x];
- obj[_y] = obj_end[_y];
- obj[_z] = obj_end[_z];
- obj[_x] += repere_obj.v[_x];
- obj[_y] += repere_obj.v[_y];
- obj[_z] += repere_obj.v[_z];
- //obj[_x] += world_position[_x];
- //obj[_y] += world_position[_y];
- //obj[_z] += world_position[_z];
- // Camera Management
- obj[_x] -= repere_cam.v[_x];
- obj[_y] -= repere_cam.v[_y];
- obj[_z] -= repere_cam.v[_z];
- // Rotate xyz
- obj_end[_x] = obj[_x] * ((cam_cos.v[_y] * cam_cos.v[_z])) - obj[_y] * ((cam_cos.v[_y] * cam_sin.v[_z])) - obj[_z] * (cam_sin.v[_y]);
- obj_end[_y] = obj[_x] * ((cam_cos.v[_x] * cam_sin.v[_z]) - (cam_sin.v[_x] * cam_sin.v[_y] * cam_cos.v[_z])) + obj[_y] * ((cam_sin.v[_x] * cam_sin.v[_y] * cam_sin.v[_z]) + (cam_cos.v[_x] * cam_cos.v[_z])) - obj[_z] * (cam_sin.v[_x] * cam_cos.v[_y]);
- obj_end[_z] = obj[_x] * ((cam_cos.v[_x] * cam_sin.v[_y] * cam_cos.v[_z]) + (cam_sin.v[_x] * cam_sin.v[_z])) + obj[_y] * ((cam_sin.v[_x] * cam_cos.v[_z]) - (cam_cos.v[_x] * cam_sin.v[_y] * cam_sin.v[_z])) + obj[_z] * (cam_cos.v[_x] * cam_cos.v[_y]);
- obj[_x] = obj_end[_x];
- obj[_y] = obj_end[_y];
- obj[_z] = obj_end[_z];
- obj[_x] -= position_cam.v[_x];
- obj[_y] -= position_cam.v[_y];
- obj[_z] -= position_cam.v[_z];
- obj[_z] *= -1;
- obj[_x] = (obj[_x] * DISTANCE) / (obj[_z]);
- obj[_y] = (obj[_y] * DISTANCE) / (obj[_z]);
- if ((obj[_x] <= (screen_info[_x] / 2) - 0 && obj[_x] >= (-screen_info[_x] / 2)) &&
- (obj[_y] <= (screen_info[_y] / 2) - 0 && obj[_y] >= -(screen_info[_y] / 2)) && (obj[_z] <= 0))
- {
- offset_pixel = repere - (screen_info[_x] * (int)obj[_y]) + (int)obj[_x];
- screen[offset_pixel] = _obj[_color];
- }
- }
- void make_voxel_map(float *cube, float size)
- {
- float x, z;
- float cote_voxel_cube = size;
- int indice;
- float angle;
- x = cote_voxel_cube;
- indice = angle = 0;
- while (x > -cote_voxel_cube) //fill_cube_volume
- {
- z = cote_voxel_cube;
- while (z > -cote_voxel_cube) //fill_cube_line
- {
- angle += 5;
- cube[indice + _x] = x * 8;
- cube[indice + _y] = sin(DEG2RAD(angle)) * 20;
- cube[indice + _z] = z * 8;
- cube[indice + _color] = BLUE;
- indice += 4;
- z--;
- }
- angle = 0;
- x--;
- }
- }
- void make_voxel_cube(float *cube, float size)
- {
- float x, y, z;
- float cote_voxel_cube = size;
- int indice;
- x = cote_voxel_cube;
- indice = 0;
- while (x > -cote_voxel_cube) //fill_cube_volume
- {
- y = cote_voxel_cube;
- while (y > -cote_voxel_cube) //fill_cube_surface
- {
- z = cote_voxel_cube;
- while (z > -cote_voxel_cube) //fill_cube_line
- {
- cube[indice + _x] = x * 1; // distance between vertex
- cube[indice + _y] = y * 1;
- cube[indice + _z] = z * 1;
- cube[indice + _color] = BLUE;
- indice += 4;
- z--;
- }
- y--;
- }
- x--;
- }
- }
- void put_object(float *object, int size)
- {
- sincosps_angle.xmm = _mm_mul_ps(angle_obj.xmm, pi_180.xmm);
- obj_sin.v[_x] = sin(sincosps_angle.v[0]);
- obj_sin.v[_y] = sin(sincosps_angle.v[1]);
- obj_sin.v[_z] = sin(sincosps_angle.v[2]);
- obj_cos.v[_x] = cos(sincosps_angle.v[0]);
- obj_cos.v[_y] = cos(sincosps_angle.v[1]);
- obj_cos.v[_z] = cos(sincosps_angle.v[2]);
- sincosps_angle.xmm = _mm_mul_ps(angle_cam.xmm, pi_180.xmm);
- cam_sin.v[_x] = sin(-sincosps_angle.v[0]);
- cam_sin.v[_y] = sin(-sincosps_angle.v[1]);
- cam_sin.v[_z] = sin(-sincosps_angle.v[2]);
- cam_cos.v[_x] = cos(-sincosps_angle.v[0]);
- cam_cos.v[_y] = cos(-sincosps_angle.v[1]);
- cam_cos.v[_z] = cos(-sincosps_angle.v[2]);
- // Camera Management
- // right/left
- cam_x.v[_x] = speed_cam * (cam_cos.v[_y] * cam_cos.v[_z]);
- cam_x.v[_y] = speed_cam * (cam_cos.v[_x] * cam_sin.v[_z]) - (cam_sin.v[_x] * cam_sin.v[_y] * cam_cos.v[_z]);
- cam_x.v[_z] = speed_cam * (cam_cos.v[_x] * cam_sin.v[_y] * cam_cos.v[_z]) + (cam_sin.v[_x] * cam_sin.v[_z]);
- // up/down
- cam_y.v[_x] = speed_cam * (cam_cos.v[_y] * cam_sin.v[_z]);
- cam_y.v[_y] = speed_cam * (cam_sin.v[_x] * cam_sin.v[_y] * cam_sin.v[_z]) + (cam_cos.v[_x] * cam_cos.v[_z]);
- cam_y.v[_z] = speed_cam * (cam_sin.v[_x] * cam_cos.v[_z]) - (cam_cos.v[_x] * cam_sin.v[_y] * cam_sin.v[_z]);
- // forward/backward
- cam_z.v[_x] = speed_cam * (cam_sin.v[_y]);
- cam_z.v[_y] = speed_cam * (cam_sin.v[_x] * cam_cos.v[_y]);
- cam_z.v[_z] = speed_cam * (cam_cos.v[_x] * cam_cos.v[_y]);
- while (size)
- {
- put_pixel(object);
- object += 4;
- size--;
- }
- }
- void clear_screen()
- {
- int loop = 0;
- while (loop < screen_info[_x] * screen_info[_y])
- screen[loop++] = BLACK;
- }
- void reset_phi()
- {
- if (angle_obj.v[_x] >= 360)
- angle_obj.v[_x] = angle_obj.v[_x] - 360;
- if (angle_obj.v[_y] >= 360)
- angle_obj.v[_y] = angle_obj.v[_y] - 360;
- if (angle_obj.v[_z] >= 360)
- angle_obj.v[_z] = angle_obj.v[_z] - 360;
- if (angle_obj.v[_x] <= -360)
- angle_obj.v[_x] = angle_obj.v[_x] + 360;
- if (angle_obj.v[_y] <= -360)
- angle_obj.v[_y] = angle_obj.v[_y] + 360;
- if (angle_obj.v[_z] <= -360)
- angle_obj.v[_z] = angle_obj.v[_z] + 360;
- }
- void upload_screen()
- {
- SetBitmapBits(texture, screen_info[_x] * screen_info[_y] * BPP, screen);
- BitBlt(device_context_screen, 0, 0, screen_info[_x], screen_info[_y], device_context_texture, 0, 0, SRCCOPY);
- }
- void manage_keyboard(UINT message, WPARAM state)
- {
- //printf("msg = %d\n", message);
- //printf("state = %d\n", state);
- switch (message)
- {
- case WM_KEYDOWN:
- switch (state)
- {
- case VK_ESCAPE:
- break;
- case 'W': // Moving Forward
- repere_cam.v[_x] += cam_z.v[_x];
- repere_cam.v[_y] += cam_z.v[_y];
- repere_cam.v[_z] += cam_z.v[_z];
- break;
- case 'S': // Movin Backward
- repere_cam.v[_x] -= cam_z.v[_x];
- repere_cam.v[_y] -= cam_z.v[_y];
- repere_cam.v[_z] -= cam_z.v[_z];
- break;
- case 'D': // Moving Right
- repere_cam.v[_x] += cam_x.v[_x];
- repere_cam.v[_y] += cam_x.v[_y];
- repere_cam.v[_z] += cam_x.v[_z];
- break;
- case 'A': // Moving Left
- repere_cam.v[_x] -= cam_x.v[_x];
- repere_cam.v[_y] -= cam_x.v[_y];
- repere_cam.v[_z] -= cam_x.v[_z];
- break;
- case 'Z': // Rotate Left
- angle_cam.v[_y] -= 2;
- break;
- case 'X': // Rotate Right
- angle_cam.v[_y] += 2;
- break;
- case 'Q': // Moving Up
- repere_cam.v[_x] += cam_y.v[_x];
- repere_cam.v[_y] += cam_y.v[_y];
- repere_cam.v[_z] += cam_y.v[_z];
- break;
- case 'E': // Moving Down
- repere_cam.v[_x] -= cam_y.v[_x];
- repere_cam.v[_y] -= cam_y.v[_y];
- repere_cam.v[_z] -= cam_y.v[_z];
- break;
- }
- break;
- case WM_KEYUP:
- switch (state)
- {
- case VK_SHIFT:
- last_key = 0;
- break;
- }
- break;
- // ALT + `
- case 260:
- switch (state)
- {
- case 222:
- quit = 0;
- break;
- }
- break;
- case MK_CONTROL:
- break;
- //PostMessage(windows_handle, WM_KEYUP, VK_ESCAPE, 0);
- //SendMessage(windows_handle, WM_KEYUP, 0, 0);
- case WM_CLOSE:
- quit = 0;
- break;
- }
- }
- void manage_mouse(UINT message, WPARAM state, int x, int y)
- {
- float add_angle[2];
- float temp[4];
- reset_phi();
- x = x - (screen_info[_x] / 2);
- y = y - (screen_info[_y] / 2);
- y *= -1;
- switch (message)
- {
- case WM_MOUSEMOVE:
- switch (state)
- {
- case MK_LBUTTON:
- add_angle[_x] = (y - prev_coord_mouse[_y]) / 2;
- add_angle[_y] = (x - prev_coord_mouse[_x]) / 2;
- angle_cam.v[_y] += add_angle[_y];
- angle_cam.v[_x] += add_angle[_x];
- break;
- case MK_RBUTTON:
- break;
- }
- prev_coord_mouse[_x] = x;
- prev_coord_mouse[_y] = y;
- break;
- case WM_MOUSEWHEEL:
- switch (state)
- {
- case SHIFT_WHEELUP:
- repere_cam.v[_z] -= 0.8;
- break;
- case SHIFT_WHEELDOWN:
- repere_cam.v[_z] += 0.8;
- break;
- }
- break;
- case WM_LBUTTONDOWN:
- // puts("WM_LBUTTONDOWN");
- break;
- case WM_LBUTTONUP:
- // puts("WM_LBUTTONUP");
- break;
- case WM_RBUTTONDOWN:
- // puts("WM_RBUTTONDOWN");
- break;
- case WM_RBUTTONUP:
- //puts("WM_RBUTTONUP");
- break;
- case WM_MBUTTONDOWN:
- //puts("WM_MBUTTONDOWN");
- break;
- case WM_MBUTTONUP:
- // puts("WM_MBUTTONUP");
- break;
- case WM_XBUTTONDOWN:
- //puts("WM_XBUTTONDOWN");
- break;
- case WM_XBUTTONUP:
- //puts("WM_XBUTTONUP");
- break;
- }
- }
- LRESULT CALLBACK windows_procedure(HWND windows_handle, UINT message, WPARAM w_param_msg, LPARAM l_param_msg)
- {
- switch (message)
- {
- case WM_SIZE:
- screen_info[_x] = LOWORD(l_param_msg);
- screen_info[_y] = HIWORD(l_param_msg);
- repere = (screen_info[_x] * (screen_info[_y] / 2 - 1)) + ((screen_info[_x] / 2 - 1));
- texture = CreateCompatibleBitmap(device_context_screen, screen_info[_x], screen_info[_y]);
- device_context_texture = CreateCompatibleDC(device_context_screen);
- SelectObject(device_context_texture, texture);
- break;
- }
- manage_keyboard(message, w_param_msg); // msg, state
- manage_mouse(message, w_param_msg, LOWORD(l_param_msg), HIWORD(l_param_msg)); // msg, state, x, y
- // Switch first or 2nd instruction for get windowed or full screen
- return DefWindowProc(windows_handle, message, w_param_msg, l_param_msg);;
- //return 1;
- }
- void init_video(void)
- {
- windows_class.cbClsExtra = 0;
- windows_class.cbWndExtra = 0;
- windows_class.hbrBackground = 0;
- windows_class.hCursor = 0;
- windows_class.hIcon = icon_program;
- windows_class.hInstance = instance;
- windows_class.lpfnWndProc = windows_procedure;
- windows_class.lpszClassName = "Classe 1";
- windows_class.lpszMenuName = NULL;
- windows_class.style = CS_HREDRAW | CS_VREDRAW;
- RegisterClass(&windows_class);
- windows_handle = CreateWindow("Classe 1",
- "VoxEngine",
- WS_OVERLAPPEDWINDOW | WS_VISIBLE,
- CW_USEDEFAULT, CW_USEDEFAULT, screen_info[_x], screen_info[_y],
- NULL,
- NULL,
- instance,
- NULL);
- device_context_screen = GetDC(windows_handle);
- texture = CreateCompatibleBitmap(device_context_screen, screen_info[_x], screen_info[_y]);
- device_context_texture = CreateCompatibleDC(device_context_screen);
- SelectObject(device_context_texture, texture);
- }
- int main(HINSTANCE _instance, HINSTANCE _previous_instance, LPSTR cmd_line, int cmd_show)
- {
- windows_handle_2 = GetDesktopWindow();
- instance = _instance;
- icon_program = LoadImage(NULL, "Data/Icon.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
- system("color 0A");
- pi_180.v[_x] = PI / 180;
- pi_180.v[_y] = PI / 180;
- pi_180.v[_z] = PI / 180;
- pi_180.v[3] = 0;
- screen_info[_x] = 1024;
- screen_info[_y] = 800;
- repere = (screen_info[_x] * (screen_info[_y] / 2 - 1)) + ((screen_info[_x] / 2 - 1));
- init_video();
- make_voxel_map(voxel_map, 500);
- //make_voxel_cube(voxel_cube, 49);
- while (quit)
- {
- PeekMessage(&event, windows_handle, 0, 0, PM_REMOVE);
- windows_procedure(windows_handle, event.message, event.wParam, event.lParam);
- put_object(voxel_map, 1000 * 1000);
- //put_object(voxel_cube, 1000 * 1000);
- upload_screen();
- // Show FPS:
- FPS_COUNTER_DATA[0]++;
- if (clock() - FPS_COUNTER_DATA[1] >= 1000)
- {
- printf("FPS = %d\n", FPS_COUNTER_DATA[0]);
- FPS_COUNTER_DATA[0] = 0;
- FPS_COUNTER_DATA[1] = clock();
- }
- clear_screen();
- }
- return 0xdeadbeef;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement