ui working, performance is mid

parent 0a849517
CFLAGS = -Wno-unused-command-line-argument -Wno-missing-field-initializers -Wall -Wextra -Wpedantic -lm
DEBUG_CFLAGS = -g -DDEBUG
LDLIBS = $(shell pkg-config --libs sdl2)
CFLAGS := $(CFLAGS) -O3
LDLIBS = $(shell pkg-config --libs sdl2 SDL2_ttf)
CFLAGS := $(CFLAGS) -O3
CFLAGS := $(CFLAGS) $(DEBUG_CFLAGS)
SRCDIR=src
......@@ -11,14 +11,17 @@ BIULDDIR=build
# compiler
CC = gcc
OBJS = $(BIULDDIR)/mouse.o
OBJS = $(BIULDDIR)/mouse.o $(BIULDDIR)/ui.o
all: mandelbrot
mandelbrot: $(SRCDIR)/mandelbrot.c $(OBJS)
$(CC) $(CFLAGS) $(LDLIBS) $^ -o $@
$(BIULDDIR)/mouse.o: src/mouse.c
$(BIULDDIR)/mouse.o: $(SRCDIR)/mouse.c
$(CC) -c $(CFLAGS) $< -o $@
$(BIULDDIR)/ui.o: $(SRCDIR)/ui.c
$(CC) -c $(CFLAGS) $< -o $@
clean:
......
No preview for this file type
File added
No preview for this file type
......@@ -10,7 +10,7 @@
#include "mandelbrot.h"
#include "mouse.h"
#include "ui.h"
int
mandelbrot(Complex c) {
......@@ -29,57 +29,14 @@ mandelbrot(Complex c) {
return MAX_ITERATIONS;
}
struct{
SDL_Renderer *renderer;
ViewInfo view;
int start_x;
int end_x;
int start_y;
int end_y;
} typedef T_render_data ;
void *
t_render(void *render_data_vp)
{
T_render_data *data = (T_render_data *)render_data_vp;
SDL_SetRenderDrawColor(data->renderer, 0, 0, 50, 255);
SDL_RenderClear(data->renderer);
for (int x = 0; x < SCREEN_WIDTH; x++) {
for (int y = 0; y < SCREEN_HEIGHT; y++) {
double real = data->view.x_min + (x * (data->view.x_max - data->view.x_min)) / SCREEN_WIDTH;
double imag = data->view.y_min + (y * (data->view.y_max - data->view.y_min)) / SCREEN_HEIGHT;
Complex c = {real, imag};
int iterations = mandelbrot(c);
if (iterations == MAX_ITERATIONS){
SDL_SetRenderDrawColor(data->renderer, 0, 0, 0, 255);
} else {
double t = (double)iterations / MAX_ITERATIONS;
t = 0.5 + 0.5 * cos(log(t + 0.0001) * 3.0);
int r = (int)(255 * t);
int g = (int)(255 * t * 0.4);
int b = (int)(255 * t * 0.2);
SDL_SetRenderDrawColor(data->renderer, r, g, b, 255);
}
SDL_RenderDrawPoint(data->renderer, x, y);
}
}
pthread_exit(NULL);
}
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);
for (int x = 0; x < SCREEN_WIDTH; x++) {
for (int y = 0; y < SCREEN_HEIGHT; y++) {
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;
Complex c = {real, imag};
......@@ -143,13 +100,20 @@ main(int argc, char *argv[])
Uint32 frame_start;
int frame_time;
UI ui;
init_ui(&ui);
int running = 1;
while (running)
{
frame_start = SDL_GetTicks();
SDL_Event event;
while (SDL_PollEvent(&event))
{
if (handle_ui_event(&ui, event, &view))
continue;
switch (event.type)
{
case SDL_QUIT:
......@@ -178,26 +142,15 @@ main(int argc, char *argv[])
render(app.renderer,
view,
0, SCREEN_WIDTH,
0,SCREEN_HEIGHT);
0,SCREEN_HEIGHT);
int msec = SDL_GetTicks() - frame_start;
float fps;
float fps = 0;
if(msec > 0)
fps = 1000.0 / (double) msec;
printf("fps:%f\n", fps);
/*for (int x = 0; x < SCREEN_HEIGHT; x += SCREEN_HEIGHT / THREADS * 2)
for (int y = 0; y < SCREEN_WIDTH; y += SCREEN_WIDTH / THREADS * 2)
{
T_render_data data = {
app.renderer,
view,
x, x + SCREEN_WIDTH / THREADS * 2,
y, y + SCREEN_HEIGHT/ THREADS * 2,
};
pthread_create();
}
*/
render_ui(&ui, app.renderer, view, fps);
SDL_RenderPresent(app.renderer);
frame_time = SDL_GetTicks() - frame_start;
......
......@@ -8,30 +8,30 @@
#define MAX_ITERATIONS 300
#define THREADS 4
struct{
typedef struct {
double real;
double imag;
} typedef Complex;
} Complex;
struct{
typedef struct{
SDL_Window *window;
SDL_Renderer *renderer;
} typedef App ;
} App ;
struct{
typedef struct{
double x_min;
double x_max;
double y_min;
double y_max;
double zoom;
} typedef ViewInfo ;
} ViewInfo ;
struct{
typedef struct{
int dragging;
int start_x;
int start_y;
ViewInfo original_view;
} typedef Mouse ;
} Mouse ;
void render(SDL_Renderer* renderer, ViewInfo view, int start_x, int end_x, int start_y, int end_y);
......
......@@ -28,9 +28,6 @@ handle_mouse(SDL_Event event, Mouse* mouse, ViewInfo* view) {
double zoom_factor = event.wheel.y > 0 ? 0.9 : 1.1;
double new_width = (view->x_max - view->x_min) * zoom_factor;
double new_height = (view->y_max - view->y_min) * zoom_factor;
view->x_min = mouse_real - (mouse_real - view->x_min) * zoom_factor;
view->x_max = mouse_real + (view->x_max - mouse_real) * zoom_factor;
view->y_min = mouse_imag - (mouse_imag - view->y_min) * zoom_factor;
......
#include "ui.h"
void
render_text(SDL_Renderer* renderer, TTF_Font* font, const char* text, SDL_Rect* rect) {
SDL_Color color = {200, 200, 200, UI_ALPHA};
SDL_Surface* surface = TTF_RenderText_Blended(font, text, color);
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
SDL_Rect text_rect = {
rect->x + (rect->w - surface->w) / 2,
rect->y + (rect->h - surface->h) / 2,
surface->w,
surface->h
};
SDL_RenderCopy(renderer, texture, NULL, &text_rect);
SDL_FreeSurface(surface);
SDL_DestroyTexture(texture);
}
void
init_ui(UI* ui)
{
ui->reset_button = (SDL_Rect){UI_PADDING, UI_PADDING, BUTTON_WIDTH, BUTTON_HEIGHT};
ui->zoom_display= (SDL_Rect){UI_PADDING, UI_PADDING * 2 + BUTTON_HEIGHT,
BUTTON_WIDTH, BUTTON_HEIGHT};
ui->fps_display = (SDL_Rect){UI_PADDING, UI_PADDING * 3 + BUTTON_HEIGHT * 2,
BUTTON_WIDTH, BUTTON_HEIGHT};
TTF_Init();
ui->font = TTF_OpenFont("/usr/share/fonts/nerdfonts/TerminessNerdFont-Regular.ttf", FONT_SIZE);
if (!ui->font) {
printf("Font yüklenemedi: %s\n", TTF_GetError());
}
}
void
render_ui(UI* ui, SDL_Renderer* renderer, ViewInfo view, float fps)
{
SDL_SetRenderDrawColor(renderer, 60, 60, 60, UI_ALPHA);
SDL_RenderFillRect(renderer, &ui->reset_button);
SDL_RenderFillRect(renderer, &ui->zoom_display);
SDL_RenderFillRect(renderer, &ui->fps_display);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, UI_ALPHA);
SDL_RenderDrawRect(renderer, &ui->reset_button);
SDL_RenderDrawRect(renderer, &ui->zoom_display);
SDL_RenderDrawRect(renderer, &ui->fps_display);
if (ui->font) {
render_text(renderer, ui->font, "Reset", &ui->reset_button);
char buf[32];
snprintf(buf, sizeof(buf), "Zoom: %.2fx", view.zoom);
render_text(renderer, ui->font, buf, &ui->zoom_display);
snprintf(buf, sizeof(buf), "Fps: %f", fps);
render_text(renderer, ui->font, buf, &ui->fps_display);
}
}
int
handle_ui_event(UI* ui, SDL_Event event, ViewInfo* view)
{
if (event.type == SDL_MOUSEBUTTONDOWN && event.button.button == SDL_BUTTON_LEFT) {
int x = event.button.x;
int y = event.button.y;
if (SDL_PointInRect(&(SDL_Point){x, y}, &ui->reset_button)) {
view->x_min = -2.0;
view->x_max = 1.0;
view->y_min = -1.5;
view->y_max = 1.5;
view->zoom = 1.0;
return 1;
}
}
return 0;
}
void cleanup_ui(UI* ui)
{
if (ui->font) {
TTF_CloseFont(ui->font);
}
TTF_Quit();
}
#ifndef UI_H
#define UI_H
#include <SDL2/SDL.h>
#include <SDL2/SDL_ttf.h>
#include "mouse.h"
#include "mandelbrot.h"
#define BUTTON_WIDTH 120
#define BUTTON_HEIGHT 30
#define PREVIEW_SIZE 200
#define UI_PADDING 10
#define UI_ALPHA 200
#define FONT_SIZE 16
typedef struct {
SDL_Rect reset_button;
SDL_Rect zoom_display;
SDL_Rect fps_display;
TTF_Font* font;
} UI;
void init_ui(UI* ui);
void render_ui(UI* ui, SDL_Renderer* renderer, ViewInfo view, float fps);
int handle_ui_event(UI* ui, SDL_Event event, ViewInfo* view);
void cleanup_ui(UI* ui);
#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