A lot of stuff...

parent 38f28414
CFLAGS = -Wno-unused-command-line-argument -Wno-missing-field-initializers -Wall -Wextra -Wpedantic -lm CFLAGS = -Wno-unused-command-line-argument -Wno-missing-field-initializers -Wall -Wextra -Wpedantic -lm -fopenmp
DEBUG_CFLAGS = -g -DDEBUG DEBUG_CFLAGS = -g -DDEBUG
LDLIBS = $(shell pkg-config --libs sdl2 SDL2_ttf) LDLIBS = $(shell pkg-config --libs sdl2 SDL2_ttf)
...@@ -9,7 +9,8 @@ CFLAGS := $(CFLAGS) $(DEBUG_CFLAGS) ...@@ -9,7 +9,8 @@ CFLAGS := $(CFLAGS) $(DEBUG_CFLAGS)
SRCDIR=src SRCDIR=src
BIULDDIR=build BIULDDIR=build
# compiler # compiler
CC = gcc #CC = gcc
CC = clang
OBJS = $(BIULDDIR)/mouse.o $(BIULDDIR)/ui.o OBJS = $(BIULDDIR)/mouse.o $(BIULDDIR)/ui.o
......
No preview for this file type
No preview for this file type
No preview for this file type
#include <SDL2/SDL_events.h> #include <SDL2/SDL_events.h>
#include <SDL2/SDL_render.h> #include <SDL2/SDL_render.h>
#include <SDL2/SDL_scancode.h>
#include <SDL2/SDL_surface.h> #include <SDL2/SDL_surface.h>
#include <SDL2/SDL_timer.h> #include <SDL2/SDL_timer.h>
#include <SDL2/SDL_video.h> #include <SDL2/SDL_video.h>
#include <stdio.h> #include <stdio.h>
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include <complex.h> #include <complex.h>
#include <pthread.h> #include<omp.h>
#include "mandelbrot.h" #include "mandelbrot.h"
#include "mouse.h" #include "mouse.h"
...@@ -30,21 +31,22 @@ mandelbrot(Complex c) { ...@@ -30,21 +31,22 @@ mandelbrot(Complex c) {
} }
void void
render(SDL_Renderer* renderer, ViewInfo view, int start_x, int end_x, int start_y, int end_y) { render(App *app, ViewInfo view, int start_x, int end_x, int start_y, int end_y) {
SDL_SetRenderDrawColor(renderer, 0, 0, 50, 255); SDL_SetRenderDrawColor(app->renderer, 0, 0, 50, 255);
SDL_RenderClear(renderer); SDL_RenderClear(app->renderer);
//#pragma omp parallel for schedule(guided)
for (int x = start_x; x < end_x; x++) { for (int x = start_x; x < end_x; x++) {
for (int y = start_y; y < end_y; y++) { for (int y = start_y; y < end_y; y++) {
double real = view.x_min + (x * (view.x_max - view.x_min)) / SCREEN_WIDTH; double real = view.x_min + (x * (view.x_max - view.x_min)) / app->win_width;
double imag = view.y_min + (y * (view.y_max - view.y_min)) / SCREEN_HEIGHT; double imag = view.y_min + (y * (view.y_max - view.y_min)) / app->win_height;
Complex c = {real, imag}; Complex c = {real, imag};
int iterations = mandelbrot(c); int iterations = mandelbrot(c);
if (iterations == MAX_ITERATIONS){ if (iterations == MAX_ITERATIONS){
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_SetRenderDrawColor(app->renderer, 0, 0, 0, 255);
} else { } else {
double t = (double)iterations / MAX_ITERATIONS; double t = (double)iterations / MAX_ITERATIONS;
t = 0.5 + 0.5 * cos(log(t + 0.0001) * 3.0); t = 0.5 + 0.5 * cos(log(t + 0.0001) * 3.0);
...@@ -53,9 +55,9 @@ render(SDL_Renderer* renderer, ViewInfo view, int start_x, int end_x, int start_ ...@@ -53,9 +55,9 @@ render(SDL_Renderer* renderer, ViewInfo view, int start_x, int end_x, int start_
int g = (int)(255 * t * 0.4); int g = (int)(255 * t * 0.4);
int b = (int)(255 * t * 0.2); int b = (int)(255 * t * 0.2);
SDL_SetRenderDrawColor(renderer, r, g, b, 255); SDL_SetRenderDrawColor(app->renderer, r, g, b, 255);
} }
SDL_RenderDrawPoint(renderer, x, y); SDL_RenderDrawPoint(app->renderer, x, y);
} }
} }
} }
...@@ -74,10 +76,12 @@ main(int argc, char *argv[]) ...@@ -74,10 +76,12 @@ main(int argc, char *argv[])
SDL_CreateWindow("Mandelbrot set exploer", SDL_CreateWindow("Mandelbrot set exploer",
0, 0, 0, 0,
SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT,
SDL_WINDOW_SHOWN), SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL),
SDL_CreateRenderer(app.window, SDL_CreateRenderer(app.window,
-1, -1,
SDL_RENDERER_ACCELERATED) SDL_RENDERER_ACCELERATED),
SCREEN_HEIGHT,
SCREEN_WIDTH
}; };
ViewInfo view = { ViewInfo view = {
...@@ -95,10 +99,7 @@ main(int argc, char *argv[]) ...@@ -95,10 +99,7 @@ main(int argc, char *argv[])
.original_view = view .original_view = view
}; };
const int FPS = 60;
const int FRAME_DELAY = 1000 / FPS;
Uint32 frame_start; Uint32 frame_start;
int frame_time;
UI ui; UI ui;
init_ui(&ui); init_ui(&ui);
...@@ -119,6 +120,11 @@ main(int argc, char *argv[]) ...@@ -119,6 +120,11 @@ main(int argc, char *argv[])
case SDL_QUIT: case SDL_QUIT:
running = 0; running = 0;
break; break;
case SDL_WINDOWEVENT:
if(event.window.event == SDL_WINDOWEVENT_RESIZED){
SDL_GetWindowSize(app.window, &app.win_width, &app.win_height);
}
break;
case SDL_KEYDOWN: case SDL_KEYDOWN:
switch (event.key.keysym.scancode) switch (event.key.keysym.scancode)
{ {
...@@ -126,6 +132,20 @@ main(int argc, char *argv[]) ...@@ -126,6 +132,20 @@ main(int argc, char *argv[])
case SDL_SCANCODE_ESCAPE: case SDL_SCANCODE_ESCAPE:
running = 0; running = 0;
break; break;
case SDL_SCANCODE_MINUS:
view.x_min = view.x_min * 1.1;
view.x_max = view.x_max * 1.1;
view.y_min= view.y_min * 1.1;
view.y_max = view.y_max * 1.1;
view.zoom = view.zoom * 1.1;
break;
case SDL_SCANCODE_EQUALS:
view.x_min = view.x_min * 0.9;
view.x_max = view.x_max * 0.9;
view.y_min= view.y_min * 0.9;
view.y_max = view.y_max * 0.9;
view.zoom = view.zoom * 0.9;
break;
} }
default: default:
handle_mouse(event, &mouse, &view); handle_mouse(event, &mouse, &view);
...@@ -136,13 +156,10 @@ main(int argc, char *argv[]) ...@@ -136,13 +156,10 @@ main(int argc, char *argv[])
SDL_RenderClear(app.renderer); SDL_RenderClear(app.renderer);
//drawing happens here //drawing happens here
pthread_t threads[THREADS]; render(&app,
int thread = 0;
render(app.renderer,
view, view,
0, SCREEN_WIDTH, 0, app.win_width,
0,SCREEN_HEIGHT); 0,app.win_height);
int msec = SDL_GetTicks() - frame_start; int msec = SDL_GetTicks() - frame_start;
float fps = 0; float fps = 0;
...@@ -153,9 +170,6 @@ main(int argc, char *argv[]) ...@@ -153,9 +170,6 @@ main(int argc, char *argv[])
SDL_RenderPresent(app.renderer); SDL_RenderPresent(app.renderer);
frame_time = SDL_GetTicks() - frame_start;
if (frame_time < FRAME_DELAY)
SDL_Delay(FRAME_DELAY - frame_time);
} }
//SDL_FreeSurface(app.surfaceA); //SDL_FreeSurface(app.surfaceA);
SDL_DestroyRenderer(app.renderer); SDL_DestroyRenderer(app.renderer);
......
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
#define SCREEN_WIDTH 640 #define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480 #define SCREEN_HEIGHT 480
#define MAX_ITERATIONS 300 #define MAX_ITERATIONS 200
#define THREADS 4 #define FRAMES_TO_CALCULATE_FPS 10
typedef struct { typedef struct {
double real; double real;
...@@ -16,6 +16,8 @@ typedef struct { ...@@ -16,6 +16,8 @@ typedef struct {
typedef struct{ typedef struct{
SDL_Window *window; SDL_Window *window;
SDL_Renderer *renderer; SDL_Renderer *renderer;
int win_height;
int win_width;
} App ; } App ;
typedef struct{ typedef struct{
...@@ -33,7 +35,6 @@ typedef struct{ ...@@ -33,7 +35,6 @@ typedef struct{
ViewInfo original_view; ViewInfo original_view;
} Mouse ; } Mouse ;
void render(SDL_Renderer* renderer, ViewInfo view, int start_x, int end_x, int start_y, int end_y); void render(App *app, ViewInfo view, int start_x, int end_x, int start_y, int end_y);
#endif #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment