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
LDLIBS = $(shell pkg-config --libs sdl2 SDL2_ttf)
......@@ -9,7 +9,8 @@ CFLAGS := $(CFLAGS) $(DEBUG_CFLAGS)
SRCDIR=src
BIULDDIR=build
# compiler
CC = gcc
#CC = gcc
CC = clang
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_render.h>
#include <SDL2/SDL_scancode.h>
#include <SDL2/SDL_surface.h>
#include <SDL2/SDL_timer.h>
#include <SDL2/SDL_video.h>
#include <stdio.h>
#include <SDL2/SDL.h>
#include <complex.h>
#include <pthread.h>
#include<omp.h>
#include "mandelbrot.h"
#include "mouse.h"
......@@ -30,21 +31,22 @@ mandelbrot(Complex c) {
}
void
render(SDL_Renderer* renderer, ViewInfo view, int start_x, int end_x, int start_y, int end_y) {
SDL_SetRenderDrawColor(renderer, 0, 0, 50, 255);
SDL_RenderClear(renderer);
render(App *app, ViewInfo view, int start_x, int end_x, int start_y, int end_y) {
SDL_SetRenderDrawColor(app->renderer, 0, 0, 50, 255);
SDL_RenderClear(app->renderer);
//#pragma omp parallel for schedule(guided)
for (int x = start_x; x < end_x; x++) {
for (int y = start_y; y < end_y; y++) {
double real = view.x_min + (x * (view.x_max - view.x_min)) / SCREEN_WIDTH;
double imag = view.y_min + (y * (view.y_max - view.y_min)) / SCREEN_HEIGHT;
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)) / app->win_height;
Complex c = {real, imag};
int iterations = mandelbrot(c);
if (iterations == MAX_ITERATIONS){
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_SetRenderDrawColor(app->renderer, 0, 0, 0, 255);
} else {
double t = (double)iterations / MAX_ITERATIONS;
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_
int g = (int)(255 * t * 0.4);
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[])
SDL_CreateWindow("Mandelbrot set exploer",
0, 0,
SCREEN_WIDTH, SCREEN_HEIGHT,
SDL_WINDOW_SHOWN),
SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL),
SDL_CreateRenderer(app.window,
-1,
SDL_RENDERER_ACCELERATED)
SDL_RENDERER_ACCELERATED),
SCREEN_HEIGHT,
SCREEN_WIDTH
};
ViewInfo view = {
......@@ -95,10 +99,7 @@ main(int argc, char *argv[])
.original_view = view
};
const int FPS = 60;
const int FRAME_DELAY = 1000 / FPS;
Uint32 frame_start;
int frame_time;
UI ui;
init_ui(&ui);
......@@ -119,13 +120,32 @@ main(int argc, char *argv[])
case SDL_QUIT:
running = 0;
break;
case SDL_KEYDOWN:
case SDL_WINDOWEVENT:
if(event.window.event == SDL_WINDOWEVENT_RESIZED){
SDL_GetWindowSize(app.window, &app.win_width, &app.win_height);
}
break;
case SDL_KEYDOWN:
switch (event.key.keysym.scancode)
{
case SDL_SCANCODE_Q:
case SDL_SCANCODE_ESCAPE:
running = 0;
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:
handle_mouse(event, &mouse, &view);
......@@ -136,13 +156,10 @@ main(int argc, char *argv[])
SDL_RenderClear(app.renderer);
//drawing happens here
pthread_t threads[THREADS];
int thread = 0;
render(app.renderer,
render(&app,
view,
0, SCREEN_WIDTH,
0,SCREEN_HEIGHT);
0, app.win_width,
0,app.win_height);
int msec = SDL_GetTicks() - frame_start;
float fps = 0;
......@@ -153,9 +170,6 @@ main(int argc, char *argv[])
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_DestroyRenderer(app.renderer);
......
......@@ -5,8 +5,8 @@
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define MAX_ITERATIONS 300
#define THREADS 4
#define MAX_ITERATIONS 200
#define FRAMES_TO_CALCULATE_FPS 10
typedef struct {
double real;
......@@ -16,6 +16,8 @@ typedef struct {
typedef struct{
SDL_Window *window;
SDL_Renderer *renderer;
int win_height;
int win_width;
} App ;
typedef struct{
......@@ -33,7 +35,6 @@ typedef struct{
ViewInfo original_view;
} 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
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