55 Commits
hugo ... master

Author SHA1 Message Date
asus
09b313686c added new square gif 2024-05-25 23:32:06 +02:00
asus
ce6642df4f updated libft submodule url 2024-05-25 19:38:47 +02:00
asus
5770acd462 added installation infos in readme 2024-05-25 19:32:04 +02:00
asus
bd2e239b94 change image xcf 2024-02-01 17:38:04 +01:00
asus
c56307f755 wip readme presentation 2024-01-20 23:27:26 +01:00
asus
613b65089a wip readme presentation 2024-01-20 23:17:42 +01:00
asus
f12c7f7bce wip readme presentation 2024-01-20 22:52:15 +01:00
asus
1c64bf93e9 wip readme presentation 2024-01-20 22:48:23 +01:00
asus
89d3e079f4 wip readme presentation 2024-01-20 21:17:30 +01:00
asus
5576971b10 wip readme presentation 2024-01-20 17:14:57 +01:00
asus
f4a3707b39 wip readme presentation 2024-01-20 15:45:57 +01:00
asus
600b51b6e7 wip readme presentation 2024-01-20 15:41:02 +01:00
asus
f1ac1efaba wip readme presentation 2024-01-20 15:35:52 +01:00
asus
22ce374b58 wip readme presentation 2024-01-19 20:51:34 +01:00
asus
957764cabb wip readme presentation 2024-01-19 20:29:26 +01:00
asus
211204e888 - added debouncing option
- added some gif for presentation
2024-01-19 20:09:21 +01:00
asus
60b4a82489 fix pbm with get_next_line 2024-01-19 18:52:58 +01:00
asus
78d6e35c7f added libft and minilibx linux and macos as submodules 2024-01-09 15:52:05 +01:00
asus
70e0c6abfe change textures 2024-01-09 15:15:20 +01:00
Hugo LAMY
5505adf02c map files ok 2022-05-05 14:54:27 +02:00
Hugo LAMY
c89c107e09 solved leaks still reachable because gnl wasn't going to the end, and close fd 2022-05-04 22:00:36 +02:00
Hugo LAMY
d4e5f298fa some norminettes and error in memorybook when adding a 2d pointer 2022-05-04 18:54:21 +02:00
Philippe BLAGOJEVIC
6000629c17 Fixed RGB parsing 2022-05-04 16:53:38 +02:00
Hugo LAMY
a6c61ec557 clean libft 2022-05-04 16:10:31 +02:00
Philippe BLAGOJEVIC
362668fe35 Added memorybook to parsing and cleaned most of the files 2022-05-04 14:38:34 +02:00
hugogogo
e564e7c8e9 back to normal execution with map argument 2022-05-04 11:33:29 +02:00
hugogogo
b5f3d2d384 resolve segfault for close right wall view 2022-05-04 00:58:20 +02:00
hugogogo
3c76a8646a plr orientation at begining 2022-05-04 00:55:47 +02:00
hugogogo
eb3b5c37a8 maybe resolved wall distorsion 2022-05-03 23:57:19 +02:00
hugogogo
101680c839 tmp bring back rays and highlight for debug purpose 2022-05-03 21:43:00 +02:00
hugogogo
4414917234 clean a little 2022-05-03 20:51:11 +02:00
hugogogo
9b28e20199 resolve wall distorsion and lag 2022-05-03 18:10:41 +02:00
hugogogo
f882f57396 wall don't distord when bigger than screen 2022-05-03 17:06:39 +02:00
hugogogo
a9c25ee5df texture in place, but they slide :p 2022-05-03 13:11:26 +02:00
hugogogo
5b60406124 textures start to appears 2022-05-03 10:18:22 +02:00
hugogogo
a2ed84c5e1 add null initialisation of mlx pointers and move mb init closer to begining 2022-05-02 23:36:27 +02:00
hugogogo
75692c09a6 wip calcul texture image x position, and add protection when creating texture 2022-05-02 23:19:27 +02:00
hugogogo
628a0c0cad add init textures 2022-05-02 16:11:54 +02:00
hugogogo
a6fd2df6d5 suppression of the map view 2022-05-02 09:39:03 +02:00
hugogogo
a2e4db41a9 resolve 3d deformation when map too big 2022-05-01 23:40:20 +02:00
hugogogo
eb5f2db7fa changed rgb deal, and improve memorybook with 2d 2022-05-01 22:55:00 +02:00
hugogogo
43852938c4 add new file for textures 2022-05-01 21:07:11 +02:00
hugogogo
858af3d1c1 3d view works 2022-05-01 10:46:25 +02:00
hugogogo
853fb39c84 changed all equations of wall height calculation to resolve pixelisation, but dead axis rays re-appeared 2022-05-01 09:49:41 +02:00
hugogogo
888fa7c116 plr start on middle of a cell, and wall height is well proportionned 2022-04-30 12:09:44 +02:00
hugogogo
58b862ce82 wip 3d is sort of working 2022-04-29 21:01:57 +02:00
hugogogo
778ddef393 wip solving buble effect by wall height calculation 2022-04-29 09:57:41 +02:00
hugogogo
81aef1eab0 resolve floating point exception when wliding through walls 2022-04-28 23:42:15 +02:00
hugogogo
9042b373a9 tmp restore a 3d view 2022-04-28 21:05:39 +02:00
hugogogo
0557decc7a add maps test 2022-04-28 20:54:42 +02:00
hugogogo
883ca19ba5 Merge branch 'hugo' 2022-04-28 20:30:17 +02:00
hugogogo
bdc87d1b7b Merge branch 'master' of github.com:hugodu69/cube3d 2022-04-28 20:28:07 +02:00
pblagoje
54585e7974 Merged parsing_connected branch to master 2022-04-28 19:55:06 +02:00
hugogogo
fef8da1659 Merge branch 'master' of github.com:hugodu69/cube3d 2022-04-26 21:23:33 +02:00
Philippe BLAGOJEVIC
f53e66556b Connected parsing to rest of the game 2022-04-23 20:12:13 +02:00
145 changed files with 31667 additions and 7521 deletions

5
.gitmodules vendored
View File

@@ -1,6 +1,9 @@
[submodule "libs/libft"] [submodule "libs/libft"]
path = libs/libft path = libs/libft
url = git@bitbucket.org:hugogogo/libft.git url = git@bitbucket.org:hugogogo/int_01_libft.git
[submodule "libs/minilibx-linux"] [submodule "libs/minilibx-linux"]
path = libs/minilibx-linux path = libs/minilibx-linux
url = https://github.com/42Paris/minilibx-linux.git url = https://github.com/42Paris/minilibx-linux.git
[submodule "libs/minilibx-macos"]
path = libs/minilibx-macos
url = git@github.com:World42/minilibx_macos.git

View File

@@ -13,6 +13,8 @@ OS = $(shell uname)
# sources # sources
D_SRCS = srcs \ D_SRCS = srcs \
srcs/init \ srcs/init \
srcs/gnl \
srcs/parsing \
srcs/hook \ srcs/hook \
srcs/draw \ srcs/draw \
srcs/player \ srcs/player \
@@ -21,10 +23,22 @@ D_SRCS = srcs \
SRCS = cube3d.c SRCS = cube3d.c
# mem/ # mem/
SRCS += memorybook.c \ SRCS += memorybook.c \
memorybook_2d.c \
memorybook_utils.c memorybook_utils.c
# init/ # init/
SRCS += init_struct.c \ SRCS += init_struct.c \
init_parsing.c init_textures.c \
init_game.c
# gnl/
SRCS += get_next_line.c \
get_next_line_utils.c
# parsing/
SRCS += init_parsing.c \
check_extension.c \
check_path.c \
check_rgb.c \
check_map_borders.c \
check_map_content.c
# hook/ # hook/
SRCS += keyhook.c \ SRCS += keyhook.c \
key_action_1.c \ key_action_1.c \
@@ -36,7 +50,8 @@ SRCS += player_moves.c \
# draw/ # draw/
SRCS += draw.c \ SRCS += draw.c \
ray_intersect.c \ ray_intersect.c \
raycast.c raycast.c \
draw_column.c
# headers # headers
D_HEADERS = headers D_HEADERS = headers
@@ -66,6 +81,7 @@ RM_OBJS = rm -rf $(D_OBJS)
# flags # flags
CFLAGS = -Wall -Wextra -Werror $(INCLUDES) CFLAGS = -Wall -Wextra -Werror $(INCLUDES)
CFLAGS += -g3 CFLAGS += -g3
#CFLAGS += -fsanitize=address
LFLAGS = -L$(D_LFT) -lft LFLAGS = -L$(D_LFT) -lft
LFLAGS += -L$(D_LMLX) -lm -lmlx -lXext -lX11 LFLAGS += -L$(D_LMLX) -lm -lmlx -lXext -lX11
@@ -92,7 +108,7 @@ $(NAME): $(OBJS)
$(CC) $(OBJS) -o $@ $(LFLAGS) $(CFLAGS) $(CC) $(OBJS) -o $@ $(LFLAGS) $(CFLAGS)
leaks: $(NAME) leaks: $(NAME)
valgrind --leak-check=full --show-leak-kinds=all ./$(NAME) valgrind --leak-check=full --show-leak-kinds=all ./$(NAME) maps/map_valid_03.cub
clean: clean:
$(RM_OBJS) $(RM_OBJS)

198
README.md
View File

@@ -1,98 +1,114 @@
# todo # cube3D
---
### install
---
this project uses submodules recursively, so you after cloning you need to :
`git submodule update --init --recursive`
### presentation
---
This project is a 3D mini game, that uses raycasting to produce a FPP (first person perspective), something like Wolfenstein3D or Doom.
![moving into the 3D](assets/cube3d_aller_retour.gif)
It creates a 3D view from a map in a text file, and move the view as if we were walking and looking around.
An example of a map :
```
$> cat -e map.cub
111111111111111111111111$
1......................1$
1......................1$
1......................1$
1.....11111....1.1.1...1$
1.....1...1............1$
1.....1...1....1...1...1$
1.....1...1....E.......1$
1.....11.11....1.1.1...1$
1......................1$
1......................1$
1......................1$
1......................1$
1......................1$
1.......11.............1$
1.......11.............1$
111111..11............11$
11.1....11.............1$
11....1.11............11$
11.1....11.............1$
11.1111111............11$
11...................111$
1111111111..........1111$
111111111111111111111111$
$>
```
This map will produce this 3D view :
![moving into the 3D](assets/cube3d_tour.gif)
You can change the images on the wall :
![change the images on the wall](assets/cube3d_image.gif)
And change the map itself :
![change the map](assets/cube3d_map.gif)
# raycasting
---
Raycasting is a technic that creates the illusion of 3D with low computational power.
This technic has the hability to not show hidden area by design, which is a great simplification for rendering.
How it works :
1. first you determine the position and orientation of the viewer in the map, and the distance and width of the screen
![map with viewer position](assets/raycast_1.png)
2. then you will scan this fictif screen with rays, each ray will correspond to a column in the 3D view
![animation of rays scanning the map and creating columns in 3D view](assets/raycast_2c.gif)
3. when a ray reaches a wall, it draw it in the 3D view
![example of one ray drawing one column with portion of wall](assets/raycast_3.png)
4. the height of the wall is inversely proportional to the length of the ray : the shorter the ray, the higher the wall
![example of two rays drawing two columns with portion of different height walls](assets/raycast_4.png)
5. so a full scan gives the illusion of perspective
![animation of rays scanning the whole map and creating a 3D with fish eye deformation](assets/raycast_5.gif)
6. but this gives rounded walls, like a fish eye effect, because rays change length while scanning the wall, so we must apply a correction according to the angle
![animation of rays scanning the whole map and creating a 3D with fish eye correction](assets/raycast_6.gif)
7. another step by step example to show how drawing gains in precision with more rays :
![animation of raytracing with increasing number of rays](assets/raycast_7.gif)
8. example of raycasting in action, with errors, during the construction phase of the raycasting algorithm :
![real raycasting during the construction phase of the project](assets/cube3d_raycasting.gif)
- resolve view buble
- add textures
# ressources # ressources
---
- [tuto mlx](https://harm-smits.github.io/42docs/libs/minilibx/getting_started.html) - [tuto mlx](https://harm-smits.github.io/42docs/libs/minilibx/getting_started.html)
- [tuto raycasting](https://lodev.org/cgtutor/raycasting.html)
- [tuto raycasting js](http://www.playfuljs.com/a-first-person-engine-in-265-lines) - [tuto raycasting js](http://www.playfuljs.com/a-first-person-engine-in-265-lines)
- [tuto mlx and wolf3d](https://github.com/qst0/ft_libgfx) - [course about matrices and transformations in space (chapter 1 to 5)](https://www.youtube.com/watch?v=fNk_zzaMoSs&list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab)
- [tuto mlx images](https://github.com/keuhdall/images_example)
- [bmp images](https://web.archive.org/web/20080912171714/http://www.fortunecity.com/skyscraper/windows/364/bmpffrmt.html)
- [bmp images in c](https://stackoverflow.com/questions/2654480/writing-bmp-image-in-pure-c-c-without-other-libraries)
---
# keys numbers
```
+-------------.-------.-------+------.-------.-------+------.-------.-------+
| keys linux mac | keys linux mac | keys linux mac |
|-------------.-------.-------|------.-------.-------|------.-------.-------+
| direction keys | alpha keys | num keys |
|-------------.-------.-------|------.-------.-------|------.-------.-------+
| w forward . 119 . _____ | a . 97 . _____ | & (0). (38) . _____ |
| a left . 97 . _____ | b . 98 . _____ | é (1). (233) . _____ |
| s backward . 115 . _____ | c . 99 . _____ | " (2). (34) . _____ |
| d right . 100 . _____ | d . 100 . _____ | ' (3). (39) . _____ |
|-------------.-------.-------| e . 101 . _____ | ( (4). (40) . _____ |
| arrows keys | f . 102 . _____ | - (5). (45) . _____ |
|-------------.-------.-------| g . 103 . _____ | è (6). (232) . _____ |
| ← . 65361 . _____ | h . 104 . _____ | _ (7). (95) . _____ |
| → . 65363 . _____ | i . 105 . _____ | ç (8). (231) . _____ |
| ↓ . 65364 . _____ | j . 106 . _____ | à (9). (224) . _____ |
| ↑ . 65362 . _____ | k . 107 . _____ |------.-------.-------|
|-------------.-------.-------| l . 108 . _____ | other keys |
| special keys | m . 109 . _____ |------.-------.-------|
|-------------.-------.-------| n . 110 . _____ | < (>). 60 . _____ |
| esc . 65307 . _____ | o . 111 . _____ | > .(60) . _____ |
| suppr . 65535 . _____ | p . 112 . _____ | space. 32 . _____ |
| delete . 65288 . _____ | q . 113 . _____ | tab . 65289 . _____ |
| enter . 65293 . _____ | r . 114 . _____ | = (+). 61 . _____ |
|-------------.-------.-------| s . 115 . _____ | + .(61) . _____ |
| hot keys | t . 116 . _____ | - . 45 . _____ |
|-------------.-------.-------| u . 117 . _____ | . . |
| shift left . 65505 . _____ | v . 118 . _____ | . . |
| shift right . 65506 . _____ | w . 119 . _____ | . . |
| ctrl left . 65507 . _____ | x . 120 . _____ | . . |
| ctrl right . 65508 . _____ | y . 121 . _____ | . . |
| . . | z . 122 . _____ | . . |
+-------------.-------.-------+------.-------.-------+------.-------.-------+
```
---
# hook key masks
- https://tronche.com/gui/x/xlib/events/keyboard-pointer/keyboard-pointer.html
```
x_event | x_mask | action
-------------------------------------------------
2 | 1L << 0 | key press
3 | 1L << 1 | key release
4 | | mouse press
5 | | mouse release
6 | | mouse move
12 | | expose event
17 | 1L << 17 | x button press (red button)
```
---
# fonctions externes autorisees :
- **open**
- **close**
- **read**
- **write**
- **malloc**
- **free**
- **perror**
- **strerror**
- **exit**
- **math lib** :
- **lm** -> needed at compilation to link the lib (eg: `gcc foo.c -o foo -lm`)
- **man**
- **man 3 math**
- **minilibx** :
- `minilibx_opengl.tgz`
- `minilibx_mms_20200219_beta.tgz`
- **to open an archive.tgz** :
- `gzip -d archive.tgz` -> turn it into archive.tar
- `tar -xf archive.tar` -> un-archive it
- how to add a man directory to the manual :
- cp man/man1 /usr/local/share/man/man1 (create man1 if necessary)
- mandb
- i didn't use any of both library above but the one for linux : https://github.com/42Paris/minilibx-linux (there are pbm with their man pages)

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 MiB

BIN
assets/cube3d_image.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 MiB

BIN
assets/cube3d_map.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
assets/cube3d_tour.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

BIN
assets/raycast_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

BIN
assets/raycast_2a.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

BIN
assets/raycast_2b.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

BIN
assets/raycast_2c.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

BIN
assets/raycast_3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

BIN
assets/raycast_4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

BIN
assets/raycast_5.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

BIN
assets/raycast_6.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

BIN
assets/raycast_7.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,3 +1,15 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* colors.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: pblagoje <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/05/04 13:34:26 by pblagoje #+# #+# */
/* Updated: 2022/05/04 13:35:12 by pblagoje ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef COLORS_H #ifndef COLORS_H
# define COLORS_H # define COLORS_H
@@ -22,4 +34,3 @@
# define RESET "\e[0m" # define RESET "\e[0m"
#endif #endif

View File

@@ -1,3 +1,15 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* cube3d.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: pblagoje <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/05/04 13:34:54 by pblagoje #+# #+# */
/* Updated: 2022/05/04 15:57:22 by hulamy ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef CUBE3D_H #ifndef CUBE3D_H
# define CUBE3D_H # define CUBE3D_H
@@ -7,6 +19,8 @@
# include <stdlib.h> // for atoi() # include <stdlib.h> // for atoi()
# include <stdio.h> // for printf() # include <stdio.h> // for printf()
# include <math.h> // for M_PI, cos(), sin() # include <math.h> // for M_PI, cos(), sin()
# include <sys/stat.h> // for open()
# include <fcntl.h> // for open flags
# include "colors.h" # include "colors.h"
# include "memorybook.h" # include "memorybook.h"
@@ -14,5 +28,9 @@
# include "cube3d_macro.h" # include "cube3d_macro.h"
# include "cube3d_struct.h" # include "cube3d_struct.h"
# include "cube3d_proto.h" # include "cube3d_proto.h"
# include "get_next_line.h"
# include <time.h> // for time
# include <sys/time.h> // for gettimeofday
#endif #endif

View File

@@ -1,3 +1,15 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* cube3d_macro.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: pblagoje <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/05/04 13:34:39 by pblagoje #+# #+# */
/* Updated: 2022/05/05 14:52:41 by hulamy ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef CUBE3D_MACRO_H #ifndef CUBE3D_MACRO_H
# define CUBE3D_MACRO_H # define CUBE3D_MACRO_H
@@ -6,23 +18,24 @@
*/ */
/* nbr pixel player move */ /* nbr pixel player move */
# define PLR_MV 1 # define PLR_MV 10
/* degree of rotation of the player per press */
# define PLR_ROT 1
/* nbr key you can press at the same time */ /* nbr key you can press at the same time */
# define MAX_NB_KEY 3 # define MAX_NB_KEY 3
/* nbr of elements to parse in the .cub file (without the map) */
# define TOTAL_ELEMENTS 6
/* screen width */ /* screen width */
# define SCREEN_WIDTH 500 # define SCREEN_WIDTH 1200
/* screen height */ /* screen height */
# define SCREEN_HEIGHT 200 # define SCREEN_HEIGHT 800
/* screen focal (in degree) */ /* screen focal (in degree) */
# define SCREEN_FOCAL 90 # define SCREEN_FOCAL 70
/* size of a cell on the map */ /* size of a cell on the map */
# define CELL 20 # define CELL 100
/* horizon fr perspectiv */ // minimum time in milliseconds between two keypress
# define HORIZON 700 # define DEBOUNCE_TIME 10
/*
* keys macro
*/
/* /*
* keys macro * keys macro

View File

@@ -1,3 +1,15 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* cube3d_proto.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: pblagoje <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/05/04 13:36:55 by pblagoje #+# #+# */
/* Updated: 2022/05/04 16:00:38 by hulamy ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef CUBE3D_PROTO_H #ifndef CUBE3D_PROTO_H
# define CUBE3D_PROTO_H # define CUBE3D_PROTO_H
@@ -6,40 +18,50 @@
// ------------------------------- // -------------------------------
// cube3d.c // cube3d.c
void destroy_mlx(void *param); void destroy_mlx(void *param);
int shut_down(); int shut_down(void);
// ------------------------------- // -------------------------------
// SRC/INIT // SRC/INIT
// ------------------------------- // -------------------------------
// init_struct.c // init_struct.c
t_game *init_game(void); t_game *init_struct(void);
// init_parsing.c // init_game.c
void init_parsing(int ac, char **av, t_game *game); void init_game(t_game *game);
// init_textures.c
void init_txtr(t_txt *txt, void *mlx_ptr);
// ------------------------------- // -------------------------------
// SRC/PARSING // SRC/PARSING
// ------------------------------- // -------------------------------
// init_parsing.c
int init_parsing(t_game *game, char *file);
// check_extension.c
int check_extension(char *filename, char *ext);
// check_path.c
int check_elements(t_game *game, char *file);
// check_rgb.c
int check_rgb(t_txt *txt, char *element, char identifier);
// check_map_borders.c
int check_map(t_map *map);
// check_map_content.c
int check_content(t_map *map);
// ------------------------------- // -------------------------------
// SRC/HOOK // SRC/HOOK
// ------------------------------- // -------------------------------
// keyhook.c // keyhook.c
int keypress(int keycode, t_game *game); int keypress(int keycode, t_game *game);
int keyrelease(int keycode, t_game *game); int keyrelease(int keycode, t_game *game);
int hook_action(t_game *game); int hook_action(t_game *game);
// key_action_1.c // key_action_1.c
int is_esc(int *k_hook, int *is_action); int is_esc(int *k_hook, int *is_action);
int is_go_left(int *k_hook, int *is_action); int is_go_left(int *k_hook, int *is_action);
int is_go_right(int *k_hook, int *is_action); int is_go_right(int *k_hook, int *is_action);
int is_go_forward(int *k_hook, int *is_action); int is_go_forward(int *k_hook, int *is_action);
int is_go_backward(int *k_hook, int *is_action); int is_go_backward(int *k_hook, int *is_action);
// key_action_2.c // key_action_2.c
int is_turn_left(int *k_hook, int *is_action); int is_turn_left(int *k_hook, int *is_action);
int is_turn_right(int *k_hook, int *is_action); int is_turn_right(int *k_hook, int *is_action);
// ------------------------------- // -------------------------------
// SRC/PLAYER // SRC/PLAYER
@@ -52,11 +74,12 @@ void plr_posy_increment(t_game *game, t_plr *plr);
// player_rotates.c // player_rotates.c
void rotate(t_plr *plr, t_coord *coord); void rotate(t_plr *plr, t_coord *coord);
void rotate_double(t_plr *plr, t_d_coord *coord); void rotate_double(t_plr *plr, t_d_coord *coord);
void plr_turn(t_plr *plr, int deg);
void plr_turn_right(t_plr *plr); void plr_turn_right(t_plr *plr);
void plr_turn_left(t_plr *plr); void plr_turn_left(t_plr *plr);
// player_limits.c // player_limits.c
int is_wall(t_game *game, int cell_x, int cell_y); int is_wall(t_game *game, int cell_x, int cell_y);
int plr_out_limits(t_game *game, int x, int y); int plr_out_limits(t_game *game, int x, int y);
// ------------------------------- // -------------------------------
// SRC/DRAW // SRC/DRAW
@@ -68,6 +91,8 @@ void draw(t_game *game);
// raycast.c // raycast.c
void raycast(t_game *game, t_rcast *rcast); void raycast(t_game *game, t_rcast *rcast);
// ray_intersect.c // ray_intersect.c
void ray_intersect(t_game *game, t_rcast *rcast, t_vec *ray); void ray_intersect_wall(t_game *game, t_rcast *rcast, t_vec *ray);
// draw_column.c
void draw_column(t_game *game, t_rcast *rcast, t_wall *wall, t_txt *txt);
#endif #endif

View File

@@ -1,3 +1,15 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* cube3d_struct.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: pblagoje <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/05/04 13:31:38 by pblagoje #+# #+# */
/* Updated: 2022/05/04 21:36:13 by hulamy ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef CUBE3D_STRUCT_H #ifndef CUBE3D_STRUCT_H
# define CUBE3D_STRUCT_H # define CUBE3D_STRUCT_H
@@ -8,19 +20,19 @@
* - vector (two points) * - vector (two points)
*/ */
typedef struct s_d_coord typedef struct s_d_coord
{ {
double x; double x;
double y; double y;
} t_d_coord; } t_d_coord;
typedef struct s_coord typedef struct s_coord
{ {
int x; int x;
int y; int y;
} t_coord; } t_coord;
typedef struct s_vec typedef struct s_vec
{ {
t_coord start; t_coord start;
t_coord end; t_coord end;
@@ -30,12 +42,25 @@ typedef struct s_vec
* struct with all elements for raycasting * struct with all elements for raycasting
*/ */
typedef struct s_rcast typedef struct s_wall
{
t_vec vec;
int height;
int limit;
int delta;
int posx;
int imgx;
} t_wall;
/*
* struct with all elements for raycasting
*/
typedef struct s_rcast
{ {
t_vec screen_size; t_vec screen_size;
t_vec ray; t_vec ray;
t_vec wall; t_wall wall;
int hor;
int screen_width; int screen_width;
int screen_height; int screen_height;
int screen_dist; int screen_dist;
@@ -56,7 +81,6 @@ typedef struct s_rcast
int ray_step_y; int ray_step_y;
int is_x; int is_x;
int ray_nb; int ray_nb;
int ray_len;
double ratio; double ratio;
} t_rcast; } t_rcast;
@@ -64,14 +88,14 @@ typedef struct s_rcast
* structs for windows, and images associated * structs for windows, and images associated
*/ */
typedef struct s_win typedef struct s_win
{ {
void *ptr; void *ptr;
int size_x; int size_x;
int size_y; int size_y;
} t_win; } t_win;
typedef struct s_img typedef struct s_img
{ {
void *ptr; void *ptr;
char *data; char *data;
@@ -79,31 +103,53 @@ typedef struct s_img
int szl; int szl;
int ndn; int ndn;
int height; int height;
int width;
} t_img; } t_img;
/*
* wall textures and floor/ceiling colors
*/
typedef struct s_txt
{
char *txt_north;
char *txt_south;
char *txt_east;
char *txt_west;
int rgb_floor;
int rgb_ceiling;
t_img img_n;
t_img img_s;
t_img img_e;
t_img img_w;
} t_txt;
/* /*
* structs for the map * structs for the map
*/ */
typedef struct s_map typedef struct s_map
{ {
char **content; char **content;
char *tmp_str;
int size_x; int size_x;
int size_y; int size_y;
int cell; int cell;
int plr_x;
int plr_y;
int plr_dir;
} t_map; } t_map;
/* /*
* structs for the player and its moves * structs for the player and its moves
*/ */
typedef struct s_plr typedef struct s_plr
{ {
// player
t_d_coord exact; t_d_coord exact;
t_coord pos; t_coord pos;
// rot
int rot; int rot;
int deg;
double cosi; double cosi;
double cosj; double cosj;
double sini; double sini;
@@ -114,23 +160,18 @@ typedef struct s_plr
* struct with all elements for the project * struct with all elements for the project
*/ */
typedef struct s_game typedef struct s_game
{ {
void *mlx_ptr; void *mlx_ptr;
// game window t_win win;
t_win win; t_img img;
t_img img; t_plr plr;
// player t_rcast rcast;
t_plr plr; t_txt txt;
// rays t_map map;
t_rcast rcast; int fd;
// map int k_hook[MAX_NB_KEY];
t_map map; struct timeval last_keypress_time;
// map window
t_win map_win;
t_img map_img;
// key hook
int k_hook[MAX_NB_KEY];
} t_game; } t_game;
#endif #endif

30
headers/get_next_line.h Normal file
View File

@@ -0,0 +1,30 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* get_next_line.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: pblagoje <pblagoje@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/01/27 12:43:50 by pblagoje #+# #+# */
/* Updated: 2022/04/18 17:01:22 by pblagoje ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef GET_NEXT_LINE_H
# define GET_NEXT_LINE_H
# define BUFFER_SIZE 100
# include <unistd.h>
# include <stdlib.h>
# include <stdio.h>
int get_next_line(int fd, char **line);
int ft_strlen_gnl(char *s);
char *ft_strchr_gnl(char *s, int c);
char *ft_strjoin_gnl(char *s1, char *s2);
char *ft_strtrim_gnl(char *s);
int ft_is_newline(char *s, int c);
char *ft_strcpy(char *s1, char *s2);
void ft_free_gnl(char **s);
#endif

View File

@@ -1,10 +1,27 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* memorybook.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: pblagoje <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/05/04 13:35:47 by pblagoje #+# #+# */
/* Updated: 2022/05/04 17:39:33 by hulamy ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef MEMORYBOOK_H #ifndef MEMORYBOOK_H
# define MEMORYBOOK_H # define MEMORYBOOK_H
void mb_init(void(*f)(void*), void *param); // memorybook.c
void mb_init(void (*f)(void*), void *param);
void *mb_alloc(size_t size); void *mb_alloc(size_t size);
void mb_add(void *addr); void mb_add(void *addr);
void mb_free(void *addr); void mb_free(void *addr);
void mb_exit(char *str); void mb_exit(char *str, int status);
// memorybook_2d.c
void mb_add_2d(void **addr, int nb);
void mb_free_2d(void **addr, int nb);
#endif #endif

1
libs/minilibx-macos Submodule

Submodule libs/minilibx-macos added at f5c4f352dd

View File

@@ -1,34 +0,0 @@
MODULE_SRC= mlx_image.swift mlx_window.swift mlx_init.swift
MODULE_OBJ=$(MODULE_SRC:.swift=.swiftmodule)
SRC= interface.swift $(MODULE_SRC)
OBJ=$(SRC:.swift=.o)
C_SRC= mlx_xpm.c mlx_png.c mlx_string_put.c
C_OBJ=$(C_SRC:.c=.o)
CFLAGS=-O3
NAME=libmlx.dylib
INC=-I.
#OPTI=-Ounchecked
all: $(NAME)
$(NAME): $(MODULE_OBJ) $(OBJ) $(C_OBJ)
swiftc $(OPTI) $(INC) -o $(NAME) -emit-library $(OBJ) $(C_OBJ) -lz
%.o: %.swift
swiftc $(OPTI) $(INC) -parse-as-library -c $< -o $@
%.swiftmodule: %.swift
swiftc $(OPTI) $(INC) -parse-as-library -c $< -o $@ -emit-module -module-name $(patsubst %.swift,%,$<) -module-link-name $(patsubst %.swift,%,$<)
clean:
rm -f $(NAME) $(OBJ) $(MODULE_OBJ) $(C_OBJ) *.swiftdoc *~

File diff suppressed because it is too large Load Diff

View File

@@ -1,292 +0,0 @@
import Cocoa
import mlx_window
import mlx_image
import mlx_init
func _mlx_bridge<T : AnyObject>(obj : T) -> UnsafeRawPointer {
return UnsafeRawPointer(Unmanaged.passUnretained(obj).toOpaque())
}
func _mlx_bridge_retained<T : AnyObject>(obj : T) -> UnsafeRawPointer {
return UnsafeRawPointer(Unmanaged.passRetained(obj).toOpaque())
}
func _mlx_bridge<T : AnyObject>(ptr : UnsafeRawPointer) -> T {
return Unmanaged<T>.fromOpaque(ptr).takeUnretainedValue()
}
func _mlx_bridge_transfer<T : AnyObject>(ptr : UnsafeRawPointer) -> T {
return Unmanaged<T>.fromOpaque(ptr).takeRetainedValue()
}
let MLX_SYNC_IMAGE_WRITABLE = Int32(1)
let MLX_SYNC_WIN_FLUSH_CMD = Int32(2)
let MLX_SYNC_WIN_CMD_COMPLETED = Int32(3)
/// C decl
@_cdecl("mlx_init")
public func mlx_init_swift() -> UnsafeRawPointer
{
let mm = MlxMain()
return (_mlx_bridge_retained(obj:mm))
}
@_cdecl("mlx_loop")
public func mlx_loop_swift(_ mlxptr:UnsafeRawPointer)
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
mlx.inLoop = true
NSApp.run()
}
@_cdecl("mlx_new_window")
public func mlx_new_window_swift(_ mlxptr:UnsafeRawPointer, Width w:UInt32, Height h:UInt32, Title t:UnsafePointer<CChar>) -> UnsafeRawPointer
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
let mw = MlxWin(device: mlx.device, width: Int(w), height: Int(h), title: String(cString: t))
mw.setNotifs()
mw.initMetal()
mlx.addWinToList(mw)
return (_mlx_bridge_retained(obj:mw))
}
@_cdecl("mlx_key_hook")
public func mlx_key_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
win.addHook(index: 3, fct: fctptr, param: paramptr)
return (Int32(0));
}
@_cdecl("mlx_mouse_hook")
public func mlx_mouse_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
win.addHook(index: 4, fct: fctptr, param: paramptr)
return (Int32(0));
}
@_cdecl("mlx_hook")
public func mlx_hook_swift(_ winptr:UnsafeRawPointer, _ xevent:Int32, _ xmask:Int32, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
win.addHook(index: Int(xevent), fct: fctptr, param: paramptr)
return (Int32(0));
}
@_cdecl("mlx_expose_hook")
public func mlx_expose_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
win.addHook(index: 12, fct: fctptr, param: paramptr)
return (Int32(0));
}
@_cdecl("mlx_loop_hook")
public func mlx_loop_hook_swift(_ mlxptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
mlx.addLoopHook(fctptr, paramptr)
return (Int32(0));
}
@_cdecl("mlx_do_key_autorepeatoff")
public func mlx_do_key_autorepeatoff_swift(_ mlxptr:UnsafeRawPointer)
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
mlx.winList.forEach{ $0.setKeyRepeat(0) }
}
@_cdecl("mlx_do_key_autorepeaton")
public func mlx_do_key_autorepeatoon_swift(_ mlxptr:UnsafeRawPointer)
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
mlx.winList.forEach{ $0.setKeyRepeat(1) }
}
@_cdecl("mlx_clear_window")
public func mlx_clear_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer)
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
win.clearWin()
}
@_cdecl("mlx_pixel_put")
public func mlx_pixel_put_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ x:Int32, _ y:Int32, _ color:UInt32)
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
win.pixelPut(x, y, color)
}
@_cdecl("mlx_get_color_value")
public func mlx_get_color_value(_ mlxptr:UnsafeRawPointer, _ color:UInt32) -> UInt32
{
return color
}
@_cdecl("mlx_new_image")
public func mlx_new_image(_ mlxptr:UnsafeRawPointer, _ width:Int32, _ height:Int32) -> UnsafeRawPointer
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
let img = MlxImg(d:mlx.device, w:Int(width), h:Int(height))
mlx.addImgToList(img)
/// print(CFGetRetainCount(img))
return (_mlx_bridge_retained(obj:img))
}
@_cdecl("mlx_get_data_addr")
public func mlx_get_data_addr_swift(_ imgptr:UnsafeRawPointer, _ bpp:UnsafeMutablePointer<Int32>, _ sizeline:UnsafeMutablePointer<Int32>, _ endian:UnsafeMutablePointer<Int32>) -> UnsafeMutablePointer<UInt32>
{
let img:MlxImg = _mlx_bridge(ptr:imgptr)
bpp.pointee = 32
sizeline.pointee = Int32(img.texture_sizeline)
endian.pointee = Int32(0)
return img.texture_data
}
@_cdecl("mlx_put_image_to_window")
public func mlx_put_image_to_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer, _ x:Int32, _ y:Int32) -> Int32
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
let img:MlxImg = _mlx_bridge(ptr:imgptr)
win.putImage(image:img, x:x, y:y)
return Int32(0)
}
@_cdecl("mlx_put_image_to_window_scale")
public func mlx_put_image_to_window_scale_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer, _ sx:Int32, _ sy:Int32, _ sw:Int32, _ sh:Int32, _ dx:Int32, _ dy:Int32, _ dw:Int32, _ dh:Int32, _ color:UInt32) -> Int32
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
let img:MlxImg = _mlx_bridge(ptr:imgptr)
win.putImageScale(image:img, sx:sx, sy:sy, sw:sw, sh:sh, dx:dx, dy:dy, dw:dw, dh:dh, c:color)
return Int32(0)
}
@_cdecl("mlx_do_sync")
public func mlx_do_sync_swift(_ mlxptr:UnsafeRawPointer) -> Int32
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
mlx.winList.forEach { $0.flushImages() }
mlx.winList.forEach { $0.waitForGPU() }
return Int32(0)
}
@_cdecl("mlx_sync")
public func mlx_sync_swift(_ what:Int32, _ param:UnsafeRawPointer) -> Int32
{
switch what
{
case MLX_SYNC_IMAGE_WRITABLE:
let img:MlxImg = _mlx_bridge(ptr:param); while img.onGPU > 0 {}
case MLX_SYNC_WIN_FLUSH_CMD:
let win:MlxWin = _mlx_bridge(ptr:param); win.flushImages()
case MLX_SYNC_WIN_CMD_COMPLETED:
let win:MlxWin = _mlx_bridge(ptr:param); win.flushImages(); win.waitForGPU()
default:
break
}
return Int32(0)
}
@_cdecl("mlx_destroy_window")
public func mlx_destroy_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer) -> Int32
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
/// bridge_transfer to get the retain, at end of this func should release the MlxWin object, because no ref anymore.
let win:MlxWin = _mlx_bridge_transfer(ptr:winptr)
win.delNotifs()
win.flushImages()
win.waitForGPU()
win.destroyWinE()
mlx.winList.removeAll(where: { $0 === win} )
return Int32(0)
}
@_cdecl("mlx_destroy_image")
public func mlx_destroy_image_swift(_ mlxptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer) -> Int32
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
/// bridge_transfer to get the retain, at end of this func should release the MlxImg object, because no ref anymore.
let img:MlxImg = _mlx_bridge_transfer(ptr:imgptr)
mlx.winList.forEach { $0.flushImages() }
while img.onGPU > 0 {}
mlx.imgList.removeAll(where: { $0 === img} )
return Int32(0)
}
@_cdecl("mlx_get_screen_size")
public func mlx_get_screen_size_swift(_ mlxptr:UnsafeRawPointer, _ sizex:UnsafeMutablePointer<Int32>, _ sizey:UnsafeMutablePointer<Int32>) -> Int32
{
/// let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
sizex.pointee = Int32(NSScreen.main!.frame.size.width)
sizey.pointee = Int32(NSScreen.main!.frame.size.height)
return Int32(0)
}
@_cdecl("mlx_mouse_hide")
public func mlx_mouse_hide_swift() -> Int32
{
NSCursor.hide()
return Int32(0)
}
@_cdecl("mlx_mouse_show")
public func mlx_mouse_show_swift() -> Int32
{
NSCursor.unhide()
return Int32(0)
}
@_cdecl("mlx_mouse_move")
public func mlx_mouse_move_swift(_ winptr:UnsafeRawPointer, _ x:Int32, _ y:Int32) -> Int32
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
let frame = win.getWinEFrame()
/// let sframe = win.getScreenFrame()
var pt = CGPoint()
pt.x = frame.origin.x + CGFloat(x)
/// pt.y = sframe.size.y - frame.size.y - frame.origin.y + 1 + y
pt.y = frame.origin.y + frame.size.height - 1.0 - CGFloat(y)
CGWarpMouseCursorPosition(pt)
CGAssociateMouseAndMouseCursorPosition(UInt32(1))
return Int32(0);
}
@_cdecl("mlx_mouse_get_pos")
public func mlx_mouse_get_pos_swift(_ winptr:UnsafeRawPointer, _ x:UnsafeMutablePointer<Int32>, _ y:UnsafeMutablePointer<Int32>) -> Int32
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
let frame = win.getWinEFrame()
let point = win.getMouseLoc()
x.pointee = Int32(point.x)
y.pointee = Int32(frame.size.height - 1.0 - point.y)
return Int32(0)
}

View File

@@ -1,110 +0,0 @@
.TH MiniLibX 3 "September 19, 2002"
.SH NAME
MiniLibX - Simple Window Interface Library for students
.SH SYNOPSYS
#include <mlx.h>
.nf
.I void *
.fi
.B mlx_init
();
.SH DESCRIPTION
MiniLibX is an easy way to create graphical software,
without any X-Window/X11 programming knowledge under Unix/Linux, nor
any AppKit programming knowledge under MacOS. It provides
simple window creation, a drawing tool, image and basic events
management.
.SH Unix/Linux: X-WINDOW CONCEPT
X-Window is a network-oriented graphical system for Unix.
It is based on two main parts:
.br
On one side, your software wants to draw something on the screen and/or
get keyboard & mouse entries.
.br
On the other side, the X-Server manages the screen, keyboard and mouse
(It is often refered to as a "display").
.br
A network connection must be established between these two entities to send
drawing orders (from the software to the X-Server), and keyboard/mouse
events (from the X-Server to the software).
.br
Nowadays, most of the time, both run on the same computer.
.SH MacOS: WINDOW SERVER AND GPU
Your software interacts directly with the Window server who handles the
cohabitation on the screen with other software and the event system,
and interacts with the GPU to handle all drawing stuff.
.SH INCLUDE FILE
.B mlx.h
should be included for a correct use of the MiniLibX API.
It only contains function prototypes, no structure is needed.
.SH LIBRARY FUNCTIONS
.P
First of all, you need to initialize the connection
between your software and the display.
Once this connection is established, you'll be able to
use other MiniLibX functions to send and receive the messages from
the display, like "I want to draw a yellow pixel in this window" or
"did the user hit a key?".
.P
The
.B mlx_init
function will create this connection. No parameters are needed, ant it will
return a
.I "void *"
identifier, used for further calls to the library routines.
.P
All other MiniLibX functions are described in the following man pages:
.TP 20
.B mlx_new_window
: manage windows
.TP 20
.B mlx_pixel_put
: draw inside window
.TP 20
.B mlx_new_image
: manipulate images
.TP 20
.B mlx_loop
: handle keyboard or mouse events
.SH LINKING MiniLibX
To use MiniLibX functions, you may need to link
your software with several libraries, including the MiniLibX library itself.
On Unix/Linux, simply add the following arguments at linking time:
.B -lmlx -lXext -lX11
On MacOS, the dynamic Metal library will find on its own the missing components:
.B -lmlx
and still on MacOS, the static OpenGL version will need:
.B -lmlx -framework OpenGL -framework AppKit -lz
You may also need to specify the path to these libraries, using
the
.B -L
flag.
.SH RETURN VALUES
If
.B mlx_init()
fails to set up the connection to the display, it will return NULL, otherwise
a non-null pointer is returned as a connection identifier.
.SH SEE ALSO
mlx_new_window(3), mlx_pixel_put(3), mlx_new_image(3), mlx_loop(3)
.SH AUTHOR
Copyright ol@ - 2002-2019 - Olivier Crouzet

View File

@@ -1,144 +0,0 @@
.TH MiniLibX 3 "September 19, 2002"
.SH NAME
MiniLibX - Handle events
.SH SYNOPSYS
.nf
.I int
.fi
.B mlx_loop
(
.I void *mlx_ptr
);
.nf
.I int
.fi
.B mlx_key_hook
(
.I void *win_ptr, int (*funct_ptr)(), void *param
);
.nf
.I int
.fi
.B mlx_mouse_hook
(
.I void *win_ptr, int (*funct_ptr)(), void *param
);
.nf
.I int
.fi
.B mlx_expose_hook
(
.I void *win_ptr, int (*funct_ptr)(), void *param
);
.nf
.I int
.fi
.B mlx_loop_hook
(
.I void *mlx_ptr, int (*funct_ptr)(), void *param
);
.SH EVENTS
The graphical system is bi-directionnal. On one hand, the program sends orders to
the screen to display pixels, images, and so on. On the other hand,
it can get information from the keyboard and mouse associated to
the screen. To do so, the program receives "events" from the keyboard or the
mouse.
.SH DESCRIPTION
To receive events, you must use
.B mlx_loop
(). This function never returns. It is an infinite loop that waits for
an event, and then calls a user-defined function associated with this event.
A single parameter is needed, the connection identifier
.I mlx_ptr
(see the
.B mlx manual).
You can assign different functions to the three following events:
.br
- A key is pressed
.br
- The mouse button is pressed
.br
- A part of the window should be re-drawn
(this is called an "expose" event, and it is your program's job to handle it in the
Unix/Linux X11 environment, but at the opposite it never happens on MacOS).
.br
Each window can define a different function for the same event.
The three functions
.B mlx_key_hook
(),
.B mlx_mouse_hook
() and
.B mlx_expose_hook
() work exactly the same way.
.I funct_ptr
is a pointer to the function you want to be called
when an event occurs. This assignment is specific to the window defined by the
.I win_ptr
identifier. The
.I param
adress will be passed to the function everytime it is called, and should be
used to store the parameters it might need.
The syntax for the
.B mlx_loop_hook
() function is identical to the previous ones, but the given function will be
called when no event occurs.
When it catches an event, the MiniLibX calls the corresponding function
with fixed parameters:
.nf
expose_hook(void *param);
key_hook(int keycode, void *param);
mouse_hook(int button, int x, int y, void *param);
loop_hook(void *param);
.fi
These function names are arbitrary. They here are used to distinguish
parameters according to the event. These functions are NOT part of the
MiniLibX.
.I param
is the address specified in the mlx_*_hook calls. This address is never
used nor modified by the MiniLibX. On key and mouse events, additional
information is passed:
.I keycode
tells you which key is pressed (with X11, look for the include file "keysymdef.h",
with MacOS, just try :) ),
(
.I x
,
.I y
) are the coordinates of the mouse click in the window, and
.I button
tells you which mouse button was pressed.
.SH GOING FURTHER WITH EVENTS
The MiniLibX provides a much generic access to other available events. The
.I mlx.h
include define
.B mlx_hook()
in the same manner mlx_*_hook functions work. The event and mask values
will be taken from the X11 include file "X.h". Some MacOS events are mapped
to these values, when it makes sense, and the mask is not used in MacOS.
See source code of the MiniLibX to find out how it will
call your own function for a specific event.
.SH SEE ALSO
mlx(3), mlx_new_window(3), mlx_pixel_put(3), mlx_new_image(3)
.SH AUTHOR
Copyright ol@ - 2002-2019 - Olivier Crouzet

View File

@@ -1,206 +0,0 @@
.TH MiniLibX 3 "September 19, 2002"
.SH NAME
MiniLibX - Manipulating images
.SH SYNOPSYS
.nf
.I void *
.fi
.B mlx_new_image
(
.I void *mlx_ptr, int width, int height
);
.nf
.I char *
.fi
.B mlx_get_data_addr
(
.I void *img_ptr, int *bits_per_pixel, int *size_line, int *endian
);
.nf
.I int
.fi
.B mlx_put_image_to_window
(
.I void *mlx_ptr, void *win_ptr, void *img_ptr, int x, int y
);
.nf
.I unsigned int
.fi
.B mlx_get_color_value
(
.I void *mlx_ptr, int color
);
.nf
.I void *
.fi
.B mlx_xpm_to_image
(
.I void *mlx_ptr, char **xpm_data, int *width, int *height
);
.nf
.I void *
.fi
.B mlx_xpm_file_to_image
(
.I void *mlx_ptr, char *filename, int *width, int *height
);
.nf
.I void *
.fi
.B mlx_png_file_to_image
(
.I void *mlx_ptr, char *filename, int *width, int *height
);
.nf
.I int
.fi
.B mlx_destroy_image
(
.I void *mlx_ptr, void *img_ptr
);
.SH DESCRIPTION
.B mlx_new_image
() creates a new image in memory. It returns a
.I void *
identifier needed to manipulate this image later. It only needs
the size of the image to be created, using the
.I width
and
.I height
parameters, and the
.I mlx_ptr
connection identifier (see the
.B mlx
manual).
The user can draw inside the image (see below), and
can dump the image inside a specified window at any time to
display it on the screen. This is done using
.B mlx_put_image_to_window
(). Three identifiers are needed here, for the connection to the
display, the window to use, and the image (respectively
.I mlx_ptr
,
.I win_ptr
and
.I img_ptr
). The (
.I x
,
.I y
) coordinates define where the image should be placed in the window.
.B mlx_get_data_addr
() returns information about the created image, allowing a user
to modify it later. The
.I img_ptr
parameter specifies the image to use. The three next parameters should
be the addresses of three different valid integers.
.I bits_per_pixel
will be filled with the number of bits needed to represent a pixel color
(also called the depth of the image).
.I size_line
is the number of bytes used to store one line of the image in memory.
This information is needed to move from one line to another in the image.
.I endian
tells you wether the pixel color in the image needs to be stored in
little endian (
.I endian
== 0), or big endian (
.I endian
== 1).
.B mlx_get_data_addr
returns a
.I char *
address that represents the begining of the memory area where the image
is stored. From this adress, the first
.I bits_per_pixel
bits represent the color of the first pixel in the first line of
the image. The second group of
.I bits_per_pixel
bits represent the second pixel of the first line, and so on.
Add
.I size_line
to the adress to get the begining of the second line. You can reach any
pixels of the image that way.
.B mlx_destroy_image
destroys the given image (
.I img_ptr
).
.SH STORING COLOR INSIDE IMAGES
Depending on the display, the number of bits used to store a pixel color
can change. The user usually represents a color in RGB mode, using
one byte for each component (see
.B mlx_pixel_put
manual). This must be translated to fit the
.I bits_per_pixel
requirement of the image, and make the color understandable to the display.
That is the purpose of the
.B mlx_get_color_value
() function. It takes a standard RGB
.I color
parameter, and returns an
.I unsigned int
value.
The
.I bits_per_pixel
least significant bits of this value can be stored in the image. You can
avoid using this function if there is no conversion needed (eg. in case of
24 bits depth, or 32 bits depth).
Keep in mind that the least significant bits position depends on the local
computer's endian. If the endian of the image differs from the local endian
(which shoud only occurs in a X11 network environment), then the value should
be transformed before being used.
.SH XPM AND PNG IMAGES
The
.B mlx_xpm_to_image
() ,
.B mlx_xpm_file_to_image
() and
.B mlx_png_file_to_image
() functions will create a new image the same way.
They will fill it using the specified
.I xpm_data
or
.I filename
, depending on which function is used.
Note that MiniLibX does not use the standard
Xpm and png libraries to deal with xpm and png images. You may not be able to
read all types of xpm and png images. It however handles transparency.
.SH RETURN VALUES
The four functions that create images,
.B mlx_new_image()
,
.B mlx_xpm_to_image()
,
.B mlx_xpm_file_to_image()
and
.B mlx_png_file_to_image()
, will return NULL if an error occurs. Otherwise they return a non-null pointer
as an image identifier.
.SH SEE ALSO
mlx(3), mlx_new_window(3), mlx_pixel_put(3), mlx_loop(3)
.SH AUTHOR
Copyright ol@ - 2002-2019 - Olivier Crouzet

View File

@@ -1,79 +0,0 @@
.TH MiniLibX 3 "September 19, 2002"
.SH NAME
MiniLibX - Managing windows
.SH SYNOPSYS
.nf
.I void *
.fi
.B mlx_new_window
(
.I void *mlx_ptr, int size_x, int size_y, char *title
);
.nf
.I int
.fi
.B mlx_clear_window
(
.I void *mlx_ptr, void *win_ptr
);
.nf
.I int
.fi
.B mlx_destroy_window
(
.I void *mlx_ptr, void *win_ptr
);
.SH DESCRIPTION
The
.B mlx_new_window
() function creates a new window on the screen, using the
.I size_x
and
.I size_y
parameters to determine its size, and
.I title
as the text that should be displayed in the window's title bar.
The
.I mlx_ptr
parameter is the connection identifier returned by
.B mlx_init
() (see the
.B mlx
man page).
.B mlx_new_window
() returns a
.I void *
window identifier that can be used by other MiniLibX calls.
Note that the MiniLibX
can handle an arbitrary number of separate windows.
.B mlx_clear_window
() and
.B mlx_destroy_window
() respectively clear (in black) and destroy the given window. They both have
the same parameters:
.I mlx_ptr
is the screen connection identifier, and
.I win_ptr
is a window identifier.
.SH RETURN VALUES
If
.B mlx_new_window()
fails to create a new window (for wathever reason), it will return NULL,
otherwise a non-null pointer is returned as a window identifier.
.B mlx_clear_window
and
.B mlx_destroy_window
right now return nothing.
.SH SEE ALSO
mlx(3), mlx_pixel_put(3), mlx_new_image(3), mlx_loop(3)
.SH AUTHOR
Copyright ol@ - 2002-2019 - Olivier Crouzet

View File

@@ -1,85 +0,0 @@
.TH MiniLibX 3 "September 19, 2002"
.SH NAME
MiniLibX - Drawing inside windows
.SH SYNOPSYS
.nf
.I int
.fi
.B mlx_pixel_put
(
.I void *mlx_ptr, void *win_ptr, int x, int y, int color
);
.nf
.I int
.fi
.B mlx_string_put
(
.I void *mlx_ptr, void *win_ptr, int x, int y, int color, char *string
);
.SH DESCRIPTION
The
.B mlx_pixel_put
() function draws a defined pixel in the window
.I win_ptr
using the (
.I x
,
.I y
) coordinates, and the specified
.I color
\&. The origin (0,0) is the upper left corner of the window, the x and y axis
respectively pointing right and down. The connection
identifier,
.I mlx_ptr
, is needed (see the
.B mlx
man page).
Parameters for
.B mlx_string_put
() have the same meaning. Instead of a simple pixel, the specified
.I string
will be displayed at (
.I x
,
.I y
).
Both functions will discard any display outside the window. This makes
.B mlx_pixel_put
slow. Consider using images instead.
.SH COLOR MANAGEMENT
The
.I color
parameter has an integer type. The displayed color needs to be encoded
in this integer, following a defined scheme. All displayable colors
can be split in 3 basic colors: red, green and blue. Three associated
values, in the 0-255 range, represent how much of each color is mixed up
to create the original color. Theses three values must be set inside the
integer to display the right color. The three least significant bytes of
this integer are filled as shown in the picture below:
.nf
| 0 | R | G | B | color integer
+---+---+---+---+
.fi
While filling the integer, make sure you avoid endian problems. Remember
that the "blue" byte should always be the least significant one.
Depending on hardware capabilities, the most significant bit can handle
transparency. Beware, at the opposite of the OpenGL classics, it does
not represent opacity.
.SH SEE ALSO
mlx(3), mlx_new_window(3), mlx_new_image(3), mlx_loop(3)
.SH AUTHOR
Copyright ol@ - 2002-2019 - Olivier Crouzet

View File

@@ -1,157 +0,0 @@
/*
** mlx.h for MinilibX in
**
** Made by Charlie Root
** Login <ol@42.fr>
**
** Started on Mon Jul 31 16:37:50 2000 Charlie Root
** Last update Tue Oct 14 16:23:28 2019 Olivier Crouzet
*/
/*
** MinilibX - Please report bugs
*/
/*
**
** This library is a simple framework to help 42 students
** create simple graphical apps.
** It only provides the minimum functions, it's students' job
** to create the missing pieces for their own project :)
**
** The MinilibX can load XPM and PNG images.
** Please note that both image loaders are incomplete, some
** image may not load.
**
** For historical reasons, the alpha byte represent transparency
** instead of opacity.
** Also, for compatibility reasons, prototypes may show inconsistant
** types.
**
** Only the dynamic library is available. It must be placed in an appropriate path.
** ./ is one of them. You can also use DYLD_LIBRARY_PATH
**
*/
#ifndef MLX_H
#define MLX_H
void *mlx_init();
/*
** needed before everything else.
** return (void *)0 if failed
*/
/*
** Basic actions
*/
void *mlx_new_window(void *mlx_ptr, int size_x, int size_y, char *title);
/*
** return void *0 if failed
*/
int mlx_clear_window(void *mlx_ptr, void *win_ptr);
int mlx_pixel_put(void *mlx_ptr, void *win_ptr, int x, int y, int color);
/*
** origin for x & y is top left corner of the window
** y down is positive
** color is 0xAARRGGBB format
** x and y must fit into the size of the window, no control is done on the values
*/
/*
** Image stuff
*/
void *mlx_new_image(void *mlx_ptr,int width,int height);
/*
** return void *0 if failed
*/
char *mlx_get_data_addr(void *img_ptr, int *bits_per_pixel,
int *size_line, int *endian);
/*
** endian : 0 = graphical sever is little endian, 1 = big endian
** usefull in a network environment where graphical app show on a remote monitor that can have a different endian
*/
int mlx_put_image_to_window(void *mlx_ptr, void *win_ptr, void *img_ptr,
int x, int y);
unsigned int mlx_get_color_value(void *mlx_ptr, int color);
/*
** dealing with Events
*/
int mlx_mouse_hook (void *win_ptr, int (*funct_ptr)(), void *param);
int mlx_key_hook (void *win_ptr, int (*funct_ptr)(), void *param);
int mlx_expose_hook (void *win_ptr, int (*funct_ptr)(), void *param);
int mlx_loop_hook (void *mlx_ptr, int (*funct_ptr)(), void *param);
int mlx_loop (void *mlx_ptr);
/*
** hook funct are called as follow :
**
** expose_hook(void *param);
** key_hook(int keycode, void *param);
** mouse_hook(int button, int x,int y, void *param);
** loop_hook(void *param);
**
*/
/*
** Usually asked...
** mlx_string_put display may vary in size between OS and between mlx implementations
*/
int mlx_string_put(void *mlx_ptr, void *win_ptr, int x, int y, int color,
char *string);
void *mlx_xpm_to_image(void *mlx_ptr, char **xpm_data,
int *width, int *height);
void *mlx_xpm_file_to_image(void *mlx_ptr, char *filename,
int *width, int *height);
void *mlx_png_file_to_image(void *mlx_ptr, char *file, int *width, int *height);
int mlx_destroy_window(void *mlx_ptr, void *win_ptr);
int mlx_destroy_image(void *mlx_ptr, void *img_ptr);
/*
** generic hook system for all events, and minilibX functions that
** can be hooked. Some macro and defines from X11/X.h are needed here.
*/
int mlx_hook(void *win_ptr, int x_event, int x_mask,
int (*funct)(), void *param);
int mlx_mouse_hide();
int mlx_mouse_show();
int mlx_mouse_move(void *win_ptr, int x, int y);
int mlx_mouse_get_pos(void *win_ptr, int *x, int *y);
int mlx_do_key_autorepeatoff(void *mlx_ptr);
int mlx_do_key_autorepeaton(void *mlx_ptr);
int mlx_do_sync(void *mlx_ptr);
#define MLX_SYNC_IMAGE_WRITABLE 1
#define MLX_SYNC_WIN_FLUSH_CMD 2
#define MLX_SYNC_WIN_CMD_COMPLETED 3
int mlx_sync(int cmd, void *param);
/*
** image_writable can loop forever if no flush occurred. Flush is always done by mlx_loop.
** cmd_completed first flush then wait for completion.
** mlx_do_sync equals cmd_completed for all windows.
** cmd is one of the define, param will be img_ptr or win_ptr accordingly
*/
int mlx_get_screen_size(void *mlx_ptr, int *sizex, int *sizey);
#endif /* MLX_H */

View File

@@ -1,48 +0,0 @@
import Metal
public class MlxImg
{
public var texture: MTLTexture
/// var texture_buff: MTLBuffer
public var texture_sizeline: Int
public var texture_data: UnsafeMutablePointer<UInt32>
public var texture_width: Int
public var texture_height: Int
public var onGPU = 0
convenience public init(d device:MTLDevice, w width:Int, h height:Int)
{
self.init(d:device, w:width, h:height, t:0)
}
public init(d device:MTLDevice, w width:Int, h height:Int, t target:Int)
{
texture_width = width
texture_height = height
texture_sizeline = width * 4
texture_sizeline = 256 * (texture_sizeline / 256 + (texture_sizeline%256 >= 1 ? 1 : 0) )
let textureDesc = MTLTextureDescriptor()
textureDesc.width = texture_width
textureDesc.height = texture_height
textureDesc.usage = .shaderRead
if (target == 1)
{
textureDesc.usage = .renderTarget
textureDesc.storageMode = .private
}
textureDesc.pixelFormat = MTLPixelFormat.bgra8Unorm
let texture_buff = device.makeBuffer(length: texture_sizeline * height)!
texture = texture_buff.makeTexture(descriptor:textureDesc, offset:0, bytesPerRow:texture_sizeline)!
let tmpptr = texture_buff.contents()
texture_data = tmpptr.assumingMemoryBound(to:UInt32.self)
}
}

View File

@@ -1,100 +0,0 @@
import Cocoa
import Metal
import mlx_window
import mlx_image
func _mlx_bridge<T : AnyObject>(obj : T) -> UnsafeMutableRawPointer? {
return UnsafeMutableRawPointer(Unmanaged.passUnretained(obj).toOpaque())
}
func _mlx_bridge<T : AnyObject>(ptr : UnsafeRawPointer) -> T {
return Unmanaged<T>.fromOpaque(ptr).takeUnretainedValue()
}
public class MlxMain {
public var winList = [MlxWin]()
public var imgList = [MlxImg]()
var myMlxApp:NSApplication?
public var device:MTLDevice!
var loopHook:UnsafeMutableRawPointer?
var loopParam:UnsafeMutableRawPointer
var loopHookTimer:CFRunLoopTimer?
public var inLoop = false
public init(_ flag:Int = 0)
{
/// make app with top menubar
myMlxApp = NSApplication.shared
if (flag == 1)
{
NSApp.setActivationPolicy(NSApplication.ActivationPolicy.prohibited) /// for non clickable win, no top menu
}
else
{
NSApp.setActivationPolicy(NSApplication.ActivationPolicy.regular)
}
device = MTLCreateSystemDefaultDevice()!
loopParam = UnsafeMutableRawPointer(&inLoop) /// dummy addr init
/// Add observer anyway to flush pixels every loop. If loop_hook exists, call it.
var ocontext = CFRunLoopObserverContext(version:0, info:_mlx_bridge(obj:self), retain:nil, release:nil, copyDescription:nil)
let observer = CFRunLoopObserverCreate(kCFAllocatorDefault, CFRunLoopActivity.beforeWaiting.rawValue, true, 0, createOCallback(), &ocontext)
CFRunLoopAddObserver(CFRunLoopGetMain(), observer, CFRunLoopMode.commonModes)
}
public func addWinToList(_ win:MlxWin)
{ winList.append(win) }
public func addImgToList(_ img:MlxImg)
{ imgList.append(img) }
func doCallLoopHook()
{
/// if (loopHook != nil)
/// {
_ = (unsafeBitCast(loopHook!,to:(@convention(c)(UnsafeRawPointer)->Void).self))(loopParam)
/// }
}
func createOCallback() -> CFRunLoopObserverCallBack
{
return { (cfRunloopObserver, cfrunloopactivity, info) -> Void in
let mlx:MlxMain = _mlx_bridge(ptr:info!)
mlx.winList.forEach { $0.flushImages() }
/// mlx.doCallLoopHook()
}
}
func createTCallback() -> CFRunLoopTimerCallBack
{
return { (cfRunloopTimer, info) -> Void in
let mlx:MlxMain = _mlx_bridge(ptr:info!)
mlx.doCallLoopHook()
}
}
public func addLoopHook(_ f:UnsafeMutableRawPointer?, _ p:UnsafeMutableRawPointer)
{
var tcontext = CFRunLoopTimerContext(version:0, info:_mlx_bridge(obj:self), retain:nil, release:nil, copyDescription:nil)
if (loopHook != nil)
{
CFRunLoopTimerInvalidate(loopHookTimer)
}
loopHook = f
loopParam = p
if (loopHook != nil)
{
loopHookTimer = CFRunLoopTimerCreate(kCFAllocatorDefault, 0.0, 0.0001, 0, 0, createTCallback(), &tcontext)
CFRunLoopAddTimer(CFRunLoopGetMain(), loopHookTimer, CFRunLoopMode.commonModes)
}
}
}

View File

@@ -1,431 +0,0 @@
#include <stdlib.h>
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <err.h>
#include <string.h>
#include <arpa/inet.h>
#include "zlib.h"
#include "mlx.h"
#define UNIQ_BPP 4
#define PNG_MAGIC_SIZE 8
unsigned char magic[PNG_MAGIC_SIZE] = {137, 80, 78, 71, 13, 10, 26, 10};
#define PNG_HDR_SIZE 13
#define Z_CHUNK 32768
#define ERR_MAGIC_SIZE 1
#define ERR_MAGIC_WRONG 2
#define ERR_STRUCT_INCOMPLETE 3
#define ERR_STRUCT_HDR 4
#define ERR_STRUCT_END 5
#define ERR_STRUCT_CRC 6
#define ERR_STRUCT_INCIMPL 7
#define ERR_STRUCT_DAT 8
#define ERR_STRUCT_MISSCHK 9
#define ERR_ZLIB 10
#define ERR_DATA_MISMATCH 11
#define ERR_DATA_FILTER 12
#define ERR_MALLOC 13
char *(mipng_err[]) =
{
"No error",
"Not enough size for magic",
"Wrong magic",
"Incomplete chunk structure",
"Duplicate or incorrect header",
"Duplicate or incorrect end",
"Invalid CRC in chunk",
"Incorrect header or configuration not implemented",
"Non consecutive dat chunks",
"Missing header/dat/end chunk(s)",
"Zlib inflate error",
"Inflated data size mismatch",
"Unknown scanline filter",
"Can't malloc"
};
typedef struct png_info_s
{
unsigned int width;
unsigned int height;
int depth;
int color;
int interlace;
int bpp;
} png_info_t;
int mipng_is_type(unsigned char *ptr, char *type)
{
if (ptr[4] == type[0] && ptr[5] == type[1] && ptr[6] == type[2] && ptr[7] == type[3])
return (1);
return (0);
}
unsigned char mipng_defilter_none(unsigned char *buff, int pos, int a, int b, int c)
{ return (buff[pos]); }
unsigned char mipng_defilter_sub(unsigned char *buff, int pos, int a, int b, int c)
{ return (buff[pos]+(unsigned int)a); }
unsigned char mipng_defilter_up(unsigned char *buff, int pos, int a, int b, int c)
{ return (buff[pos]+(unsigned int)b); }
unsigned char mipng_defilter_average(unsigned char *buff, int pos, int a, int b, int c)
{ return (buff[pos]+((unsigned int)a+(unsigned int)b)/2); }
unsigned char mipng_defilter_paeth(unsigned char *buff, int pos, int a, int b, int c)
{
int p;
int result;
p = a + b - c;
if (abs(b - c) <= abs(a - c) && abs(b - c) <= abs(a + b - c - c))
result = a;
else
if (abs(a - c) <= abs(a + b - c - c))
result = b;
else
result = c;
return (buff[pos]+result);
}
unsigned char (*(mipng_defilter[]))(unsigned char *buff, int pos, int a, int b, int c) =
{
mipng_defilter_none,
mipng_defilter_sub,
mipng_defilter_up,
mipng_defilter_average,
mipng_defilter_paeth
};
// only work for mlx mac or img 32bpp
int mipng_fill_img(void *img, unsigned char *buf, png_info_t *pi)
{
unsigned int current_filter;
int ipos;
int bpos;
int ilen;
int iline;
int blen;
int bpp;
int endian;
unsigned char tmp;
unsigned char *ibuf;
ibuf = (unsigned char *)mlx_get_data_addr(img, &bpp, &iline, &endian);
// iline = img->width * UNIQ_BPP;
// ilen = img->width * img->height * UNIQ_BPP;
ilen = iline*pi->height;
ipos = 0;
blen = pi->width * pi->height * pi->bpp + pi->height; // ??? why + pi->height ??
bpos = 0;
while (ipos < ilen && bpos < blen)
{
if (ipos % iline == 0)
{
// printf("ipos %d iline %d pi->width %d bpos %d\n", ipos, iline, pi->width, bpos);
if ((current_filter = buf[bpos++]) > 4)
{
return (ERR_DATA_FILTER);
}
}
ibuf[ipos] = mipng_defilter[current_filter](buf, bpos,
ipos%iline>3?ibuf[ipos-UNIQ_BPP]:0,
(ipos>=iline)?ibuf[ipos-iline]:0,
(ipos>=iline && ipos%iline>3)?ibuf[ipos-iline-UNIQ_BPP]:0);
ipos ++;
bpos ++;
if (pi->depth == 16)
bpos ++;
if (ipos % 4 == 3 && pi->color == 2) // no alpha
ibuf[ipos++] = 0xFF;
if (ipos % iline == pi->width * 4)
ipos += iline-pi->width*4;
}
if (ipos != ilen || bpos != blen)
{
// printf("fill err ipos %d vs %d, bpos %d vs %d\n", ipos, ilen, bpos, blen);
return (ERR_DATA_MISMATCH);
}
ipos = 0;
while (ipos < ilen)
{
tmp = ibuf[ipos];
ibuf[ipos] = ibuf[ipos+2];
ibuf[ipos+2] = tmp;
ibuf[ipos+3] = 0xFF - ibuf[ipos+3];
ipos += UNIQ_BPP;
}
return (0);
}
int mipng_data(void *img, unsigned char *dat, png_info_t *pi)
{
unsigned int len;
int b_pos;
unsigned char *buffer;
int ret;
int z_ret;
unsigned z_have;
z_stream z_strm;
unsigned char z_out[Z_CHUNK];
b_pos = 0;
if (!(buffer = malloc((long long)pi->width*(long long)pi->height*(long long)pi->bpp + pi->height)))
return (ERR_MALLOC);
z_strm.zalloc = Z_NULL;
z_strm.zfree = Z_NULL;
z_strm.opaque = Z_NULL;
z_strm.avail_in = 0;
z_strm.next_in = Z_NULL;
z_ret = inflateInit(&z_strm);
if (z_ret != Z_OK)
{
free(buffer);
return (ERR_ZLIB);
}
while (mipng_is_type(dat, "IDAT"))
{
len = *((unsigned int *)dat);
len = ntohl(len);
z_strm.avail_in = len;
z_strm.next_in = dat + 8;
z_strm.avail_out = 0;
while (z_strm.avail_out == 0)
{
z_strm.avail_out = Z_CHUNK;
z_strm.next_out = z_out;
z_ret = inflate(&z_strm, Z_NO_FLUSH);
// printf("inflate ret %d avail_out %d\n", z_ret, z_strm.avail_out);
if (z_ret != Z_OK && z_ret != Z_STREAM_END)
{
inflateEnd(&z_strm);
free(buffer);
return (ERR_ZLIB);
}
if (b_pos + Z_CHUNK - z_strm.avail_out > pi->width*pi->height*pi->bpp+pi->height)
{
inflateEnd(&z_strm);
free(buffer);
return (ERR_DATA_MISMATCH);
}
bcopy(z_out, buffer+b_pos, Z_CHUNK - z_strm.avail_out);
b_pos += Z_CHUNK - z_strm.avail_out;
}
dat += len + 4 + 4 + 4;
}
inflateEnd(&z_strm);
if (b_pos != pi->width*pi->height*pi->bpp+pi->height)
{
// printf("pb : bpos %d vs expected %d\n", b_pos, img->width*img->height*pi->bpp+img->height);
free(buffer);
return (ERR_DATA_MISMATCH);
}
ret = mipng_fill_img(img, buffer, pi);
free(buffer);
return (ret);
}
int mipng_magic(unsigned char *ptr, int size)
{
int i;
if (size < PNG_MAGIC_SIZE)
return (ERR_MAGIC_SIZE);
i = 0;
while (i < PNG_MAGIC_SIZE)
if (*(ptr++) != magic[i++])
return (ERR_MAGIC_WRONG);
return (0);
}
unsigned long crc_table[256] = { 0, 0x77073096, 0xee0e612c, 0x990951ba, 0x76dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0xedb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x9b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x1db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x6b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0xf00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x86d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x3b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x4db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0xd6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0xa00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x26d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x5005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0xcb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0xbdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d };
// From http://www.w3.org/TR/PNG/#D-CRCAppendix
int mipng_crc(unsigned char *ptr, int len)
{
unsigned int file_crc;
unsigned long crc;
int i;
file_crc = *((unsigned int *)(ptr+4+4+len));
file_crc = ntohl(file_crc);
crc = 0xffffffffL;
i = 0;
while (i < len+4)
crc = crc_table[(crc ^ ptr[(i++)+4]) & 0xff] ^ (crc >> 8);
crc ^= 0xffffffffL;
if (file_crc != crc)
return (1);
return (0);
}
int mipng_structure(unsigned char *ptr, int size, unsigned char **hdr, unsigned char **dat)
{
unsigned int len;
int dat_state;
int end;
dat_state = 0;
*hdr = NULL;
*dat = NULL;
end = 0;
while (size)
{
if (size >= 4) // length present
{
len = *((unsigned int *)ptr);
len = ntohl(len);
if (size < 4 + 4 + 4 + len)
return (ERR_STRUCT_INCOMPLETE);
if (mipng_crc(ptr, len))
return (ERR_STRUCT_CRC);
// printf("found chunk len %d type %c%c%c%c\n", len, *(ptr+4), *(ptr+5), *(ptr+6), *(ptr+7));
if (mipng_is_type(ptr, "IHDR"))
{
if (*hdr || len != PNG_HDR_SIZE)
return (ERR_STRUCT_HDR);
*hdr = ptr;
}
if (mipng_is_type(ptr, "IEND"))
{
if (len != 0 || size != 4+4+4)
return (ERR_STRUCT_END);
end = 1;
}
if (mipng_is_type(ptr, "IDAT"))
{
if (dat_state == 0)
{
dat_state = 1;
*dat = ptr;
}
if (dat_state == 2)
return (ERR_STRUCT_DAT);
}
else
if (dat_state == 1)
dat_state = 2;
size -= 4+4+4+len;
ptr += 4+4+4+len;
}
else
return (ERR_STRUCT_INCOMPLETE);
}
if (*hdr == 0 || *dat == 0 || end == 0)
return (ERR_STRUCT_MISSCHK);
return (0);
}
int mipng_verif_hdr(unsigned char *hdr, png_info_t *pi)
{
unsigned int compress;
unsigned int filter;
hdr += 8;
pi->width = ntohl(*((unsigned long *)hdr));
pi->height = ntohl(*((unsigned long *)(hdr+4)));
pi->depth = *(hdr+8);
pi->color = *(hdr+9);
compress = *(hdr+10);
filter = *(hdr+11);
pi->interlace = *(hdr+12);
if (pi->width <= 0 || pi->height <= 0 || (pi->depth != 8 && pi->depth != 16)
|| (pi->color != 2 && pi->color != 6) || compress != 0 || filter != 0 || pi->interlace != 0)
return (ERR_STRUCT_INCIMPL);
pi->bpp = pi->depth / 8;
if (pi->color == 2)
pi->bpp *= 3;
if (pi->color == 6)
pi->bpp *= 4;
// printf("hdr info : %d x %d, depth %d, col type %d, comp %d, filter %d, interlace %d\nbpp is %d\n",
// pi->width, pi->height, pi->depth, pi->color, compress, filter, pi->interlace, pi->bpp);
return (0);
}
void *mlx_int_parse_png(void *xvar, unsigned char *fptr, int size, int *width, int *height)
{
int err;
unsigned char *hdr;
unsigned char *dat;
png_info_t pi;
void *img;
if ((err = mipng_magic(fptr, size)))
{
warnx("mlx PNG error : %s", mipng_err[err]);
return ((void *)0);
}
fptr += PNG_MAGIC_SIZE;
size -= PNG_MAGIC_SIZE;
if ((err = mipng_structure(fptr, size, &hdr, &dat)))
{
warnx("mlx PNG error : %s", mipng_err[err]);
return ((void *)0);
}
if ((err = mipng_verif_hdr(hdr, &pi)))
{
warnx("mlx PNG error : %s", mipng_err[err]);
return ((void *)0);
}
if (!(img = mlx_new_image(xvar, pi.width, pi.height)))
{
warnx("mlx PNG error : Can't create mlx image");
return ((void *)0);
}
*width = pi.width;
*height = pi.height;
if ((err = mipng_data(img, dat, &pi)))
{
mlx_destroy_image(xvar, img);
warnx("mlx PNG error : %s", mipng_err[err]);
return ((void *)0);
}
return (img);
}
void *mlx_png_file_to_image(void *xvar, char *file, int *width, int *height)
{
int fd;
int size;
unsigned char *ptr;
void *img;
if ((fd = open(file, O_RDONLY)) == -1 || (size = lseek(fd, 0, SEEK_END)) == -1 ||
(ptr = mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0)) == (void *)MAP_FAILED)
{
if (fd >= 0)
close(fd);
warnx("Can't map png file '%s'", file);
return ((void *)0);
}
if (!(img = mlx_int_parse_png(xvar, ptr, size, width, height)))
{
*width = 0;
*height = 0;
}
munmap(ptr,size);
close(fd);
return (img);
}

View File

@@ -1,763 +0,0 @@
/*
** This is a generated file with rgb2c.pl and rgb.txt from
** the XFree86 distribution.
*/
struct s_col_name mlx_col_name[] =
{
{ "snow" , 0xfffafa },
{ "ghost white" , 0xf8f8ff },
{ "ghostwhite" , 0xf8f8ff },
{ "white smoke" , 0xf5f5f5 },
{ "whitesmoke" , 0xf5f5f5 },
{ "gainsboro" , 0xdcdcdc },
{ "floral white" , 0xfffaf0 },
{ "floralwhite" , 0xfffaf0 },
{ "old lace" , 0xfdf5e6 },
{ "oldlace" , 0xfdf5e6 },
{ "linen" , 0xfaf0e6 },
{ "antique white" , 0xfaebd7 },
{ "antiquewhite" , 0xfaebd7 },
{ "papaya whip" , 0xffefd5 },
{ "papayawhip" , 0xffefd5 },
{ "blanched almond" , 0xffebcd },
{ "blanchedalmond" , 0xffebcd },
{ "bisque" , 0xffe4c4 },
{ "peach puff" , 0xffdab9 },
{ "peachpuff" , 0xffdab9 },
{ "navajo white" , 0xffdead },
{ "navajowhite" , 0xffdead },
{ "moccasin" , 0xffe4b5 },
{ "cornsilk" , 0xfff8dc },
{ "ivory" , 0xfffff0 },
{ "lemon chiffon" , 0xfffacd },
{ "lemonchiffon" , 0xfffacd },
{ "seashell" , 0xfff5ee },
{ "honeydew" , 0xf0fff0 },
{ "mint cream" , 0xf5fffa },
{ "mintcream" , 0xf5fffa },
{ "azure" , 0xf0ffff },
{ "alice blue" , 0xf0f8ff },
{ "aliceblue" , 0xf0f8ff },
{ "lavender" , 0xe6e6fa },
{ "lavender blush" , 0xfff0f5 },
{ "lavenderblush" , 0xfff0f5 },
{ "misty rose" , 0xffe4e1 },
{ "mistyrose" , 0xffe4e1 },
{ "white" , 0xffffff },
{ "black" , 0x0 },
{ "dark slate" , 0x2f4f4f },
{ "darkslategray" , 0x2f4f4f },
{ "dark slate" , 0x2f4f4f },
{ "darkslategrey" , 0x2f4f4f },
{ "dim gray" , 0x696969 },
{ "dimgray" , 0x696969 },
{ "dim grey" , 0x696969 },
{ "dimgrey" , 0x696969 },
{ "slate gray" , 0x708090 },
{ "slategray" , 0x708090 },
{ "slate grey" , 0x708090 },
{ "slategrey" , 0x708090 },
{ "light slate" , 0x778899 },
{ "lightslategray" , 0x778899 },
{ "light slate" , 0x778899 },
{ "lightslategrey" , 0x778899 },
{ "gray" , 0xbebebe },
{ "grey" , 0xbebebe },
{ "light grey" , 0xd3d3d3 },
{ "lightgrey" , 0xd3d3d3 },
{ "light gray" , 0xd3d3d3 },
{ "lightgray" , 0xd3d3d3 },
{ "midnight blue" , 0x191970 },
{ "midnightblue" , 0x191970 },
{ "navy" , 0x80 },
{ "navy blue" , 0x80 },
{ "navyblue" , 0x80 },
{ "cornflower blue" , 0x6495ed },
{ "cornflowerblue" , 0x6495ed },
{ "dark slate" , 0x483d8b },
{ "darkslateblue" , 0x483d8b },
{ "slate blue" , 0x6a5acd },
{ "slateblue" , 0x6a5acd },
{ "medium slate" , 0x7b68ee },
{ "mediumslateblue" , 0x7b68ee },
{ "light slate" , 0x8470ff },
{ "lightslateblue" , 0x8470ff },
{ "medium blue" , 0xcd },
{ "mediumblue" , 0xcd },
{ "royal blue" , 0x4169e1 },
{ "royalblue" , 0x4169e1 },
{ "blue" , 0xff },
{ "dodger blue" , 0x1e90ff },
{ "dodgerblue" , 0x1e90ff },
{ "deep sky" , 0xbfff },
{ "deepskyblue" , 0xbfff },
{ "sky blue" , 0x87ceeb },
{ "skyblue" , 0x87ceeb },
{ "light sky" , 0x87cefa },
{ "lightskyblue" , 0x87cefa },
{ "steel blue" , 0x4682b4 },
{ "steelblue" , 0x4682b4 },
{ "light steel" , 0xb0c4de },
{ "lightsteelblue" , 0xb0c4de },
{ "light blue" , 0xadd8e6 },
{ "lightblue" , 0xadd8e6 },
{ "powder blue" , 0xb0e0e6 },
{ "powderblue" , 0xb0e0e6 },
{ "pale turquoise" , 0xafeeee },
{ "paleturquoise" , 0xafeeee },
{ "dark turquoise" , 0xced1 },
{ "darkturquoise" , 0xced1 },
{ "medium turquoise" , 0x48d1cc },
{ "mediumturquoise" , 0x48d1cc },
{ "turquoise" , 0x40e0d0 },
{ "cyan" , 0xffff },
{ "light cyan" , 0xe0ffff },
{ "lightcyan" , 0xe0ffff },
{ "cadet blue" , 0x5f9ea0 },
{ "cadetblue" , 0x5f9ea0 },
{ "medium aquamarine" , 0x66cdaa },
{ "mediumaquamarine" , 0x66cdaa },
{ "aquamarine" , 0x7fffd4 },
{ "dark green" , 0x6400 },
{ "darkgreen" , 0x6400 },
{ "dark olive" , 0x556b2f },
{ "darkolivegreen" , 0x556b2f },
{ "dark sea" , 0x8fbc8f },
{ "darkseagreen" , 0x8fbc8f },
{ "sea green" , 0x2e8b57 },
{ "seagreen" , 0x2e8b57 },
{ "medium sea" , 0x3cb371 },
{ "mediumseagreen" , 0x3cb371 },
{ "light sea" , 0x20b2aa },
{ "lightseagreen" , 0x20b2aa },
{ "pale green" , 0x98fb98 },
{ "palegreen" , 0x98fb98 },
{ "spring green" , 0xff7f },
{ "springgreen" , 0xff7f },
{ "lawn green" , 0x7cfc00 },
{ "lawngreen" , 0x7cfc00 },
{ "green" , 0xff00 },
{ "chartreuse" , 0x7fff00 },
{ "medium spring" , 0xfa9a },
{ "mediumspringgreen" , 0xfa9a },
{ "green yellow" , 0xadff2f },
{ "greenyellow" , 0xadff2f },
{ "lime green" , 0x32cd32 },
{ "limegreen" , 0x32cd32 },
{ "yellow green" , 0x9acd32 },
{ "yellowgreen" , 0x9acd32 },
{ "forest green" , 0x228b22 },
{ "forestgreen" , 0x228b22 },
{ "olive drab" , 0x6b8e23 },
{ "olivedrab" , 0x6b8e23 },
{ "dark khaki" , 0xbdb76b },
{ "darkkhaki" , 0xbdb76b },
{ "khaki" , 0xf0e68c },
{ "pale goldenrod" , 0xeee8aa },
{ "palegoldenrod" , 0xeee8aa },
{ "light goldenrod" , 0xfafad2 },
{ "lightgoldenrodyellow" , 0xfafad2 },
{ "light yellow" , 0xffffe0 },
{ "lightyellow" , 0xffffe0 },
{ "yellow" , 0xffff00 },
{ "gold" , 0xffd700 },
{ "light goldenrod" , 0xeedd82 },
{ "lightgoldenrod" , 0xeedd82 },
{ "goldenrod" , 0xdaa520 },
{ "dark goldenrod" , 0xb8860b },
{ "darkgoldenrod" , 0xb8860b },
{ "rosy brown" , 0xbc8f8f },
{ "rosybrown" , 0xbc8f8f },
{ "indian red" , 0xcd5c5c },
{ "indianred" , 0xcd5c5c },
{ "saddle brown" , 0x8b4513 },
{ "saddlebrown" , 0x8b4513 },
{ "sienna" , 0xa0522d },
{ "peru" , 0xcd853f },
{ "burlywood" , 0xdeb887 },
{ "beige" , 0xf5f5dc },
{ "wheat" , 0xf5deb3 },
{ "sandy brown" , 0xf4a460 },
{ "sandybrown" , 0xf4a460 },
{ "tan" , 0xd2b48c },
{ "chocolate" , 0xd2691e },
{ "firebrick" , 0xb22222 },
{ "brown" , 0xa52a2a },
{ "dark salmon" , 0xe9967a },
{ "darksalmon" , 0xe9967a },
{ "salmon" , 0xfa8072 },
{ "light salmon" , 0xffa07a },
{ "lightsalmon" , 0xffa07a },
{ "orange" , 0xffa500 },
{ "dark orange" , 0xff8c00 },
{ "darkorange" , 0xff8c00 },
{ "coral" , 0xff7f50 },
{ "light coral" , 0xf08080 },
{ "lightcoral" , 0xf08080 },
{ "tomato" , 0xff6347 },
{ "orange red" , 0xff4500 },
{ "orangered" , 0xff4500 },
{ "red" , 0xff0000 },
{ "hot pink" , 0xff69b4 },
{ "hotpink" , 0xff69b4 },
{ "deep pink" , 0xff1493 },
{ "deeppink" , 0xff1493 },
{ "pink" , 0xffc0cb },
{ "light pink" , 0xffb6c1 },
{ "lightpink" , 0xffb6c1 },
{ "pale violet" , 0xdb7093 },
{ "palevioletred" , 0xdb7093 },
{ "maroon" , 0xb03060 },
{ "medium violet" , 0xc71585 },
{ "mediumvioletred" , 0xc71585 },
{ "violet red" , 0xd02090 },
{ "violetred" , 0xd02090 },
{ "magenta" , 0xff00ff },
{ "violet" , 0xee82ee },
{ "plum" , 0xdda0dd },
{ "orchid" , 0xda70d6 },
{ "medium orchid" , 0xba55d3 },
{ "mediumorchid" , 0xba55d3 },
{ "dark orchid" , 0x9932cc },
{ "darkorchid" , 0x9932cc },
{ "dark violet" , 0x9400d3 },
{ "darkviolet" , 0x9400d3 },
{ "blue violet" , 0x8a2be2 },
{ "blueviolet" , 0x8a2be2 },
{ "purple" , 0xa020f0 },
{ "medium purple" , 0x9370db },
{ "mediumpurple" , 0x9370db },
{ "thistle" , 0xd8bfd8 },
{ "snow1" , 0xfffafa },
{ "snow2" , 0xeee9e9 },
{ "snow3" , 0xcdc9c9 },
{ "snow4" , 0x8b8989 },
{ "seashell1" , 0xfff5ee },
{ "seashell2" , 0xeee5de },
{ "seashell3" , 0xcdc5bf },
{ "seashell4" , 0x8b8682 },
{ "antiquewhite1" , 0xffefdb },
{ "antiquewhite2" , 0xeedfcc },
{ "antiquewhite3" , 0xcdc0b0 },
{ "antiquewhite4" , 0x8b8378 },
{ "bisque1" , 0xffe4c4 },
{ "bisque2" , 0xeed5b7 },
{ "bisque3" , 0xcdb79e },
{ "bisque4" , 0x8b7d6b },
{ "peachpuff1" , 0xffdab9 },
{ "peachpuff2" , 0xeecbad },
{ "peachpuff3" , 0xcdaf95 },
{ "peachpuff4" , 0x8b7765 },
{ "navajowhite1" , 0xffdead },
{ "navajowhite2" , 0xeecfa1 },
{ "navajowhite3" , 0xcdb38b },
{ "navajowhite4" , 0x8b795e },
{ "lemonchiffon1" , 0xfffacd },
{ "lemonchiffon2" , 0xeee9bf },
{ "lemonchiffon3" , 0xcdc9a5 },
{ "lemonchiffon4" , 0x8b8970 },
{ "cornsilk1" , 0xfff8dc },
{ "cornsilk2" , 0xeee8cd },
{ "cornsilk3" , 0xcdc8b1 },
{ "cornsilk4" , 0x8b8878 },
{ "ivory1" , 0xfffff0 },
{ "ivory2" , 0xeeeee0 },
{ "ivory3" , 0xcdcdc1 },
{ "ivory4" , 0x8b8b83 },
{ "honeydew1" , 0xf0fff0 },
{ "honeydew2" , 0xe0eee0 },
{ "honeydew3" , 0xc1cdc1 },
{ "honeydew4" , 0x838b83 },
{ "lavenderblush1" , 0xfff0f5 },
{ "lavenderblush2" , 0xeee0e5 },
{ "lavenderblush3" , 0xcdc1c5 },
{ "lavenderblush4" , 0x8b8386 },
{ "mistyrose1" , 0xffe4e1 },
{ "mistyrose2" , 0xeed5d2 },
{ "mistyrose3" , 0xcdb7b5 },
{ "mistyrose4" , 0x8b7d7b },
{ "azure1" , 0xf0ffff },
{ "azure2" , 0xe0eeee },
{ "azure3" , 0xc1cdcd },
{ "azure4" , 0x838b8b },
{ "slateblue1" , 0x836fff },
{ "slateblue2" , 0x7a67ee },
{ "slateblue3" , 0x6959cd },
{ "slateblue4" , 0x473c8b },
{ "royalblue1" , 0x4876ff },
{ "royalblue2" , 0x436eee },
{ "royalblue3" , 0x3a5fcd },
{ "royalblue4" , 0x27408b },
{ "blue1" , 0xff },
{ "blue2" , 0xee },
{ "blue3" , 0xcd },
{ "blue4" , 0x8b },
{ "dodgerblue1" , 0x1e90ff },
{ "dodgerblue2" , 0x1c86ee },
{ "dodgerblue3" , 0x1874cd },
{ "dodgerblue4" , 0x104e8b },
{ "steelblue1" , 0x63b8ff },
{ "steelblue2" , 0x5cacee },
{ "steelblue3" , 0x4f94cd },
{ "steelblue4" , 0x36648b },
{ "deepskyblue1" , 0xbfff },
{ "deepskyblue2" , 0xb2ee },
{ "deepskyblue3" , 0x9acd },
{ "deepskyblue4" , 0x688b },
{ "skyblue1" , 0x87ceff },
{ "skyblue2" , 0x7ec0ee },
{ "skyblue3" , 0x6ca6cd },
{ "skyblue4" , 0x4a708b },
{ "lightskyblue1" , 0xb0e2ff },
{ "lightskyblue2" , 0xa4d3ee },
{ "lightskyblue3" , 0x8db6cd },
{ "lightskyblue4" , 0x607b8b },
{ "slategray1" , 0xc6e2ff },
{ "slategray2" , 0xb9d3ee },
{ "slategray3" , 0x9fb6cd },
{ "slategray4" , 0x6c7b8b },
{ "lightsteelblue1" , 0xcae1ff },
{ "lightsteelblue2" , 0xbcd2ee },
{ "lightsteelblue3" , 0xa2b5cd },
{ "lightsteelblue4" , 0x6e7b8b },
{ "lightblue1" , 0xbfefff },
{ "lightblue2" , 0xb2dfee },
{ "lightblue3" , 0x9ac0cd },
{ "lightblue4" , 0x68838b },
{ "lightcyan1" , 0xe0ffff },
{ "lightcyan2" , 0xd1eeee },
{ "lightcyan3" , 0xb4cdcd },
{ "lightcyan4" , 0x7a8b8b },
{ "paleturquoise1" , 0xbbffff },
{ "paleturquoise2" , 0xaeeeee },
{ "paleturquoise3" , 0x96cdcd },
{ "paleturquoise4" , 0x668b8b },
{ "cadetblue1" , 0x98f5ff },
{ "cadetblue2" , 0x8ee5ee },
{ "cadetblue3" , 0x7ac5cd },
{ "cadetblue4" , 0x53868b },
{ "turquoise1" , 0xf5ff },
{ "turquoise2" , 0xe5ee },
{ "turquoise3" , 0xc5cd },
{ "turquoise4" , 0x868b },
{ "cyan1" , 0xffff },
{ "cyan2" , 0xeeee },
{ "cyan3" , 0xcdcd },
{ "cyan4" , 0x8b8b },
{ "darkslategray1" , 0x97ffff },
{ "darkslategray2" , 0x8deeee },
{ "darkslategray3" , 0x79cdcd },
{ "darkslategray4" , 0x528b8b },
{ "aquamarine1" , 0x7fffd4 },
{ "aquamarine2" , 0x76eec6 },
{ "aquamarine3" , 0x66cdaa },
{ "aquamarine4" , 0x458b74 },
{ "darkseagreen1" , 0xc1ffc1 },
{ "darkseagreen2" , 0xb4eeb4 },
{ "darkseagreen3" , 0x9bcd9b },
{ "darkseagreen4" , 0x698b69 },
{ "seagreen1" , 0x54ff9f },
{ "seagreen2" , 0x4eee94 },
{ "seagreen3" , 0x43cd80 },
{ "seagreen4" , 0x2e8b57 },
{ "palegreen1" , 0x9aff9a },
{ "palegreen2" , 0x90ee90 },
{ "palegreen3" , 0x7ccd7c },
{ "palegreen4" , 0x548b54 },
{ "springgreen1" , 0xff7f },
{ "springgreen2" , 0xee76 },
{ "springgreen3" , 0xcd66 },
{ "springgreen4" , 0x8b45 },
{ "green1" , 0xff00 },
{ "green2" , 0xee00 },
{ "green3" , 0xcd00 },
{ "green4" , 0x8b00 },
{ "chartreuse1" , 0x7fff00 },
{ "chartreuse2" , 0x76ee00 },
{ "chartreuse3" , 0x66cd00 },
{ "chartreuse4" , 0x458b00 },
{ "olivedrab1" , 0xc0ff3e },
{ "olivedrab2" , 0xb3ee3a },
{ "olivedrab3" , 0x9acd32 },
{ "olivedrab4" , 0x698b22 },
{ "darkolivegreen1" , 0xcaff70 },
{ "darkolivegreen2" , 0xbcee68 },
{ "darkolivegreen3" , 0xa2cd5a },
{ "darkolivegreen4" , 0x6e8b3d },
{ "khaki1" , 0xfff68f },
{ "khaki2" , 0xeee685 },
{ "khaki3" , 0xcdc673 },
{ "khaki4" , 0x8b864e },
{ "lightgoldenrod1" , 0xffec8b },
{ "lightgoldenrod2" , 0xeedc82 },
{ "lightgoldenrod3" , 0xcdbe70 },
{ "lightgoldenrod4" , 0x8b814c },
{ "lightyellow1" , 0xffffe0 },
{ "lightyellow2" , 0xeeeed1 },
{ "lightyellow3" , 0xcdcdb4 },
{ "lightyellow4" , 0x8b8b7a },
{ "yellow1" , 0xffff00 },
{ "yellow2" , 0xeeee00 },
{ "yellow3" , 0xcdcd00 },
{ "yellow4" , 0x8b8b00 },
{ "gold1" , 0xffd700 },
{ "gold2" , 0xeec900 },
{ "gold3" , 0xcdad00 },
{ "gold4" , 0x8b7500 },
{ "goldenrod1" , 0xffc125 },
{ "goldenrod2" , 0xeeb422 },
{ "goldenrod3" , 0xcd9b1d },
{ "goldenrod4" , 0x8b6914 },
{ "darkgoldenrod1" , 0xffb90f },
{ "darkgoldenrod2" , 0xeead0e },
{ "darkgoldenrod3" , 0xcd950c },
{ "darkgoldenrod4" , 0x8b6508 },
{ "rosybrown1" , 0xffc1c1 },
{ "rosybrown2" , 0xeeb4b4 },
{ "rosybrown3" , 0xcd9b9b },
{ "rosybrown4" , 0x8b6969 },
{ "indianred1" , 0xff6a6a },
{ "indianred2" , 0xee6363 },
{ "indianred3" , 0xcd5555 },
{ "indianred4" , 0x8b3a3a },
{ "sienna1" , 0xff8247 },
{ "sienna2" , 0xee7942 },
{ "sienna3" , 0xcd6839 },
{ "sienna4" , 0x8b4726 },
{ "burlywood1" , 0xffd39b },
{ "burlywood2" , 0xeec591 },
{ "burlywood3" , 0xcdaa7d },
{ "burlywood4" , 0x8b7355 },
{ "wheat1" , 0xffe7ba },
{ "wheat2" , 0xeed8ae },
{ "wheat3" , 0xcdba96 },
{ "wheat4" , 0x8b7e66 },
{ "tan1" , 0xffa54f },
{ "tan2" , 0xee9a49 },
{ "tan3" , 0xcd853f },
{ "tan4" , 0x8b5a2b },
{ "chocolate1" , 0xff7f24 },
{ "chocolate2" , 0xee7621 },
{ "chocolate3" , 0xcd661d },
{ "chocolate4" , 0x8b4513 },
{ "firebrick1" , 0xff3030 },
{ "firebrick2" , 0xee2c2c },
{ "firebrick3" , 0xcd2626 },
{ "firebrick4" , 0x8b1a1a },
{ "brown1" , 0xff4040 },
{ "brown2" , 0xee3b3b },
{ "brown3" , 0xcd3333 },
{ "brown4" , 0x8b2323 },
{ "salmon1" , 0xff8c69 },
{ "salmon2" , 0xee8262 },
{ "salmon3" , 0xcd7054 },
{ "salmon4" , 0x8b4c39 },
{ "lightsalmon1" , 0xffa07a },
{ "lightsalmon2" , 0xee9572 },
{ "lightsalmon3" , 0xcd8162 },
{ "lightsalmon4" , 0x8b5742 },
{ "orange1" , 0xffa500 },
{ "orange2" , 0xee9a00 },
{ "orange3" , 0xcd8500 },
{ "orange4" , 0x8b5a00 },
{ "darkorange1" , 0xff7f00 },
{ "darkorange2" , 0xee7600 },
{ "darkorange3" , 0xcd6600 },
{ "darkorange4" , 0x8b4500 },
{ "coral1" , 0xff7256 },
{ "coral2" , 0xee6a50 },
{ "coral3" , 0xcd5b45 },
{ "coral4" , 0x8b3e2f },
{ "tomato1" , 0xff6347 },
{ "tomato2" , 0xee5c42 },
{ "tomato3" , 0xcd4f39 },
{ "tomato4" , 0x8b3626 },
{ "orangered1" , 0xff4500 },
{ "orangered2" , 0xee4000 },
{ "orangered3" , 0xcd3700 },
{ "orangered4" , 0x8b2500 },
{ "red1" , 0xff0000 },
{ "red2" , 0xee0000 },
{ "red3" , 0xcd0000 },
{ "red4" , 0x8b0000 },
{ "deeppink1" , 0xff1493 },
{ "deeppink2" , 0xee1289 },
{ "deeppink3" , 0xcd1076 },
{ "deeppink4" , 0x8b0a50 },
{ "hotpink1" , 0xff6eb4 },
{ "hotpink2" , 0xee6aa7 },
{ "hotpink3" , 0xcd6090 },
{ "hotpink4" , 0x8b3a62 },
{ "pink1" , 0xffb5c5 },
{ "pink2" , 0xeea9b8 },
{ "pink3" , 0xcd919e },
{ "pink4" , 0x8b636c },
{ "lightpink1" , 0xffaeb9 },
{ "lightpink2" , 0xeea2ad },
{ "lightpink3" , 0xcd8c95 },
{ "lightpink4" , 0x8b5f65 },
{ "palevioletred1" , 0xff82ab },
{ "palevioletred2" , 0xee799f },
{ "palevioletred3" , 0xcd6889 },
{ "palevioletred4" , 0x8b475d },
{ "maroon1" , 0xff34b3 },
{ "maroon2" , 0xee30a7 },
{ "maroon3" , 0xcd2990 },
{ "maroon4" , 0x8b1c62 },
{ "violetred1" , 0xff3e96 },
{ "violetred2" , 0xee3a8c },
{ "violetred3" , 0xcd3278 },
{ "violetred4" , 0x8b2252 },
{ "magenta1" , 0xff00ff },
{ "magenta2" , 0xee00ee },
{ "magenta3" , 0xcd00cd },
{ "magenta4" , 0x8b008b },
{ "orchid1" , 0xff83fa },
{ "orchid2" , 0xee7ae9 },
{ "orchid3" , 0xcd69c9 },
{ "orchid4" , 0x8b4789 },
{ "plum1" , 0xffbbff },
{ "plum2" , 0xeeaeee },
{ "plum3" , 0xcd96cd },
{ "plum4" , 0x8b668b },
{ "mediumorchid1" , 0xe066ff },
{ "mediumorchid2" , 0xd15fee },
{ "mediumorchid3" , 0xb452cd },
{ "mediumorchid4" , 0x7a378b },
{ "darkorchid1" , 0xbf3eff },
{ "darkorchid2" , 0xb23aee },
{ "darkorchid3" , 0x9a32cd },
{ "darkorchid4" , 0x68228b },
{ "purple1" , 0x9b30ff },
{ "purple2" , 0x912cee },
{ "purple3" , 0x7d26cd },
{ "purple4" , 0x551a8b },
{ "mediumpurple1" , 0xab82ff },
{ "mediumpurple2" , 0x9f79ee },
{ "mediumpurple3" , 0x8968cd },
{ "mediumpurple4" , 0x5d478b },
{ "thistle1" , 0xffe1ff },
{ "thistle2" , 0xeed2ee },
{ "thistle3" , 0xcdb5cd },
{ "thistle4" , 0x8b7b8b },
{ "gray0" , 0x0 },
{ "grey0" , 0x0 },
{ "gray1" , 0x30303 },
{ "grey1" , 0x30303 },
{ "gray2" , 0x50505 },
{ "grey2" , 0x50505 },
{ "gray3" , 0x80808 },
{ "grey3" , 0x80808 },
{ "gray4" , 0xa0a0a },
{ "grey4" , 0xa0a0a },
{ "gray5" , 0xd0d0d },
{ "grey5" , 0xd0d0d },
{ "gray6" , 0xf0f0f },
{ "grey6" , 0xf0f0f },
{ "gray7" , 0x121212 },
{ "grey7" , 0x121212 },
{ "gray8" , 0x141414 },
{ "grey8" , 0x141414 },
{ "gray9" , 0x171717 },
{ "grey9" , 0x171717 },
{ "gray10" , 0x1a1a1a },
{ "grey10" , 0x1a1a1a },
{ "gray11" , 0x1c1c1c },
{ "grey11" , 0x1c1c1c },
{ "gray12" , 0x1f1f1f },
{ "grey12" , 0x1f1f1f },
{ "gray13" , 0x212121 },
{ "grey13" , 0x212121 },
{ "gray14" , 0x242424 },
{ "grey14" , 0x242424 },
{ "gray15" , 0x262626 },
{ "grey15" , 0x262626 },
{ "gray16" , 0x292929 },
{ "grey16" , 0x292929 },
{ "gray17" , 0x2b2b2b },
{ "grey17" , 0x2b2b2b },
{ "gray18" , 0x2e2e2e },
{ "grey18" , 0x2e2e2e },
{ "gray19" , 0x303030 },
{ "grey19" , 0x303030 },
{ "gray20" , 0x333333 },
{ "grey20" , 0x333333 },
{ "gray21" , 0x363636 },
{ "grey21" , 0x363636 },
{ "gray22" , 0x383838 },
{ "grey22" , 0x383838 },
{ "gray23" , 0x3b3b3b },
{ "grey23" , 0x3b3b3b },
{ "gray24" , 0x3d3d3d },
{ "grey24" , 0x3d3d3d },
{ "gray25" , 0x404040 },
{ "grey25" , 0x404040 },
{ "gray26" , 0x424242 },
{ "grey26" , 0x424242 },
{ "gray27" , 0x454545 },
{ "grey27" , 0x454545 },
{ "gray28" , 0x474747 },
{ "grey28" , 0x474747 },
{ "gray29" , 0x4a4a4a },
{ "grey29" , 0x4a4a4a },
{ "gray30" , 0x4d4d4d },
{ "grey30" , 0x4d4d4d },
{ "gray31" , 0x4f4f4f },
{ "grey31" , 0x4f4f4f },
{ "gray32" , 0x525252 },
{ "grey32" , 0x525252 },
{ "gray33" , 0x545454 },
{ "grey33" , 0x545454 },
{ "gray34" , 0x575757 },
{ "grey34" , 0x575757 },
{ "gray35" , 0x595959 },
{ "grey35" , 0x595959 },
{ "gray36" , 0x5c5c5c },
{ "grey36" , 0x5c5c5c },
{ "gray37" , 0x5e5e5e },
{ "grey37" , 0x5e5e5e },
{ "gray38" , 0x616161 },
{ "grey38" , 0x616161 },
{ "gray39" , 0x636363 },
{ "grey39" , 0x636363 },
{ "gray40" , 0x666666 },
{ "grey40" , 0x666666 },
{ "gray41" , 0x696969 },
{ "grey41" , 0x696969 },
{ "gray42" , 0x6b6b6b },
{ "grey42" , 0x6b6b6b },
{ "gray43" , 0x6e6e6e },
{ "grey43" , 0x6e6e6e },
{ "gray44" , 0x707070 },
{ "grey44" , 0x707070 },
{ "gray45" , 0x737373 },
{ "grey45" , 0x737373 },
{ "gray46" , 0x757575 },
{ "grey46" , 0x757575 },
{ "gray47" , 0x787878 },
{ "grey47" , 0x787878 },
{ "gray48" , 0x7a7a7a },
{ "grey48" , 0x7a7a7a },
{ "gray49" , 0x7d7d7d },
{ "grey49" , 0x7d7d7d },
{ "gray50" , 0x7f7f7f },
{ "grey50" , 0x7f7f7f },
{ "gray51" , 0x828282 },
{ "grey51" , 0x828282 },
{ "gray52" , 0x858585 },
{ "grey52" , 0x858585 },
{ "gray53" , 0x878787 },
{ "grey53" , 0x878787 },
{ "gray54" , 0x8a8a8a },
{ "grey54" , 0x8a8a8a },
{ "gray55" , 0x8c8c8c },
{ "grey55" , 0x8c8c8c },
{ "gray56" , 0x8f8f8f },
{ "grey56" , 0x8f8f8f },
{ "gray57" , 0x919191 },
{ "grey57" , 0x919191 },
{ "gray58" , 0x949494 },
{ "grey58" , 0x949494 },
{ "gray59" , 0x969696 },
{ "grey59" , 0x969696 },
{ "gray60" , 0x999999 },
{ "grey60" , 0x999999 },
{ "gray61" , 0x9c9c9c },
{ "grey61" , 0x9c9c9c },
{ "gray62" , 0x9e9e9e },
{ "grey62" , 0x9e9e9e },
{ "gray63" , 0xa1a1a1 },
{ "grey63" , 0xa1a1a1 },
{ "gray64" , 0xa3a3a3 },
{ "grey64" , 0xa3a3a3 },
{ "gray65" , 0xa6a6a6 },
{ "grey65" , 0xa6a6a6 },
{ "gray66" , 0xa8a8a8 },
{ "grey66" , 0xa8a8a8 },
{ "gray67" , 0xababab },
{ "grey67" , 0xababab },
{ "gray68" , 0xadadad },
{ "grey68" , 0xadadad },
{ "gray69" , 0xb0b0b0 },
{ "grey69" , 0xb0b0b0 },
{ "gray70" , 0xb3b3b3 },
{ "grey70" , 0xb3b3b3 },
{ "gray71" , 0xb5b5b5 },
{ "grey71" , 0xb5b5b5 },
{ "gray72" , 0xb8b8b8 },
{ "grey72" , 0xb8b8b8 },
{ "gray73" , 0xbababa },
{ "grey73" , 0xbababa },
{ "gray74" , 0xbdbdbd },
{ "grey74" , 0xbdbdbd },
{ "gray75" , 0xbfbfbf },
{ "grey75" , 0xbfbfbf },
{ "gray76" , 0xc2c2c2 },
{ "grey76" , 0xc2c2c2 },
{ "gray77" , 0xc4c4c4 },
{ "grey77" , 0xc4c4c4 },
{ "gray78" , 0xc7c7c7 },
{ "grey78" , 0xc7c7c7 },
{ "gray79" , 0xc9c9c9 },
{ "grey79" , 0xc9c9c9 },
{ "gray80" , 0xcccccc },
{ "grey80" , 0xcccccc },
{ "gray81" , 0xcfcfcf },
{ "grey81" , 0xcfcfcf },
{ "gray82" , 0xd1d1d1 },
{ "grey82" , 0xd1d1d1 },
{ "gray83" , 0xd4d4d4 },
{ "grey83" , 0xd4d4d4 },
{ "gray84" , 0xd6d6d6 },
{ "grey84" , 0xd6d6d6 },
{ "gray85" , 0xd9d9d9 },
{ "grey85" , 0xd9d9d9 },
{ "gray86" , 0xdbdbdb },
{ "grey86" , 0xdbdbdb },
{ "gray87" , 0xdedede },
{ "grey87" , 0xdedede },
{ "gray88" , 0xe0e0e0 },
{ "grey88" , 0xe0e0e0 },
{ "gray89" , 0xe3e3e3 },
{ "grey89" , 0xe3e3e3 },
{ "gray90" , 0xe5e5e5 },
{ "grey90" , 0xe5e5e5 },
{ "gray91" , 0xe8e8e8 },
{ "grey91" , 0xe8e8e8 },
{ "gray92" , 0xebebeb },
{ "grey92" , 0xebebeb },
{ "gray93" , 0xededed },
{ "grey93" , 0xededed },
{ "gray94" , 0xf0f0f0 },
{ "grey94" , 0xf0f0f0 },
{ "gray95" , 0xf2f2f2 },
{ "grey95" , 0xf2f2f2 },
{ "gray96" , 0xf5f5f5 },
{ "grey96" , 0xf5f5f5 },
{ "gray97" , 0xf7f7f7 },
{ "grey97" , 0xf7f7f7 },
{ "gray98" , 0xfafafa },
{ "grey98" , 0xfafafa },
{ "gray99" , 0xfcfcfc },
{ "grey99" , 0xfcfcfc },
{ "gray100" , 0xffffff },
{ "grey100" , 0xffffff },
{ "dark grey" , 0xa9a9a9 },
{ "darkgrey" , 0xa9a9a9 },
{ "dark gray" , 0xa9a9a9 },
{ "darkgray" , 0xa9a9a9 },
{ "dark blue" , 0x8b },
{ "darkblue" , 0x8b },
{ "dark cyan" , 0x8b8b },
{ "darkcyan" , 0x8b8b },
{ "dark magenta" , 0x8b008b },
{ "darkmagenta" , 0x8b008b },
{ "dark red" , 0x8b0000 },
{ "darkred" , 0x8b0000 },
{ "light green" , 0x90ee90 },
{ "lightgreen" , 0x90ee90 },
{ "none", -1 },
{ 0, 0 }
};

View File

@@ -1,72 +0,0 @@
#include "mlx.h"
#include "font.c"
#define ATLAS_NB_CHAR 95
#define FONT_WIDTH ((font_atlas.width/(ATLAS_NB_CHAR))-2)
int mlx_put_image_to_window_scale(void *mlx_ptr, void *win_ptr, void *img_ptr, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, unsigned int color);
void mlx_int_fill(unsigned char *data, int sl)
{
int i, j;
j = 0;
while (j < font_atlas.height)
{
i = 0;
while (i < font_atlas.width)
{
data[j*sl+i*4] = font_atlas.pixel_data[j*font_atlas.width*font_atlas.bytes_per_pixel+i*4+2];
data[j*sl+i*4+1] = font_atlas.pixel_data[j*font_atlas.width*font_atlas.bytes_per_pixel+i*4+1];
data[j*sl+i*4+2] = font_atlas.pixel_data[j*font_atlas.width*font_atlas.bytes_per_pixel+i*4];
data[j*sl+i*4+3] = 0xFF - font_atlas.pixel_data[j*font_atlas.width*font_atlas.bytes_per_pixel+i*4+3];
i ++;
}
j ++;
}
}
int mlx_string_put(void *mlx_ptr, void *win_ptr, int x, int y, int color, char *string)
{
static void *font = (void *)0;
static unsigned char *data = (void *)0;
static int size_line = 0;
int bpp;
int endian;
int pos;
int val;
int dest_w;
int dest_h;
if (font == (void *)0)
{
font = mlx_new_image(mlx_ptr, font_atlas.width, font_atlas.height);
data = (unsigned char *)mlx_get_data_addr(font, &bpp, &size_line, &endian);
mlx_int_fill(data, size_line);
}
color = (color&0xFFFFFF)|0xFF000000;
// dest_w = (FONT_WIDTH*5)/7; /// ratio with X11 standard mlx_string_put
// dest_h = (font_atlas.height*5)/7;
dest_w = FONT_WIDTH;
dest_h = font_atlas.height;
y = y - (dest_h*3)/4;
pos = 0;
while (*string)
{
if (*string >= 32 && *string <= 127)
val = *string - 32;
else
val = 31;
mlx_put_image_to_window_scale(mlx_ptr, win_ptr, font, val*(FONT_WIDTH+2), 0, FONT_WIDTH, font_atlas.height, x+pos*dest_w, y, dest_w, dest_h, color);
pos ++;
string ++;
}
return (0);
}

View File

@@ -1,541 +0,0 @@
import Cocoa
import Metal
import MetalKit
import Darwin
import mlx_image
class WinEvent: NSWindow
{
var eventFuncts = [UnsafeMutableRawPointer?]()
var eventParams = [UnsafeMutableRawPointer]()
var keyrepeat = 1
var keyflag:UInt32 = 0
var size_y:Int
init(frame rect:CGRect)
{
for _ in 0...31
{
eventFuncts.append(Optional.none)
eventParams.append(UnsafeMutableRawPointer(&keyrepeat)) /// dummy address here, null not needed
}
let wsm = NSWindow.StyleMask(rawValue: NSWindow.StyleMask.titled.rawValue|NSWindow.StyleMask.closable.rawValue|NSWindow.StyleMask.miniaturizable.rawValue)
let bck = NSWindow.BackingStoreType.buffered
size_y = Int(rect.size.height)
super.init(contentRect: rect, styleMask: wsm, backing: bck, defer: false)
}
func setNotifs()
{
NotificationCenter.default.addObserver(self, selector: #selector(exposeNotification(_:)), name: NSWindow.didBecomeKeyNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(deminiaturizeNotification(_:)), name: NSWindow.didDeminiaturizeNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(closeNotification(_:)), name: NSWindow.willCloseNotification, object: nil)
/***
[[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(exposeNotification:) name:@"NSWindowDidBecomeKeyNotification" object:win];
[[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(deminiaturizeNotification:) name:@"NSWindowDidDeminiaturizeNotification" object:win];
[[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(closeNotification:) name:@"NSWindowWillCloseNotification" object:win];
***/
}
func delNotifs()
{
NotificationCenter.default.removeObserver(self, name: NSWindow.willCloseNotification, object: nil)
}
public func setKeyRepeat(_ mode:Int)
{
keyrepeat = mode;
}
func addHook(index idx:Int, fct fptr:UnsafeMutableRawPointer?, param pptr:UnsafeMutableRawPointer)
{
eventFuncts[idx] = fptr;
eventParams[idx] = pptr;
if (idx == 6 || idx == 32)
{
if (fptr != nil) /// == nullptr)
{ self.acceptsMouseMovedEvents = true }
else { self.acceptsMouseMovedEvents = false }
}
}
override func keyDown(with event: NSEvent)
{
/// print("got keydown with code: \(event.keyCode) ")
if (event.isARepeat && keyrepeat == 0)
{ return }
if (eventFuncts[2] != nil)
{
_ = unsafeBitCast(eventFuncts[2],to:(@convention(c)(Int32, UnsafeRawPointer)->Int32).self)(Int32(event.keyCode), eventParams[2])
}
}
override func keyUp(with event: NSEvent)
{
/// print("got keyup with code: \(event.keyCode) and calling key hook")
if (event.isARepeat && keyrepeat == 0)
{ return }
if (eventFuncts[3] != nil)
{
_ = unsafeBitCast(eventFuncts[3],to:(@convention(c)(Int32, UnsafeRawPointer)->Int32).self)(Int32(event.keyCode), eventParams[3])
}
}
func get_mouse_button(with ev:NSEvent) -> Int
{
switch (ev.type) {
case NSEvent.EventType.leftMouseDown,
NSEvent.EventType.leftMouseUp,
NSEvent.EventType.leftMouseDragged:
return 1;
case NSEvent.EventType.rightMouseDown,
NSEvent.EventType.rightMouseUp,
NSEvent.EventType.rightMouseDragged:
return 2;
case NSEvent.EventType.otherMouseDown,
NSEvent.EventType.otherMouseUp,
NSEvent.EventType.otherMouseDragged:
return 3;
default:
return 0;
}
}
func mouse(with event: NSEvent, index idx:Int, type t:Int)
{
var thepoint:NSPoint
var button:Int
thepoint = event.locationInWindow
button = get_mouse_button(with:event)
/// button = event.buttonNumber
/// print(" mouse down button \(event.buttonNumber) at location \(thepoint.x) x \(thepoint.y)")
if (eventFuncts[idx] != nil)
{
if (t == 0)
{ _ = unsafeBitCast(eventFuncts[idx],to:(@convention(c)(Int32, Int32, Int32, UnsafeRawPointer)->Int32).self)(Int32(button), Int32(thepoint.x), Int32(size_y-1-Int(thepoint.y)), eventParams[idx]) }
if (t == 1)
{ _ = unsafeBitCast(eventFuncts[idx],to:(@convention(c)(Int32, Int32, UnsafeRawPointer)->Int32).self)(Int32(thepoint.x), Int32(size_y-1-Int(thepoint.y)), eventParams[idx]) }
}
}
override func mouseDown(with event: NSEvent) { mouse(with:event, index:4, type:0) }
override func rightMouseDown(with event: NSEvent) { mouse(with:event, index:4, type:0) }
override func otherMouseDown(with event: NSEvent) { mouse(with:event, index:4, type:0) }
override func mouseUp(with event: NSEvent) { mouse(with:event, index:5, type:0) }
override func rightMouseUp(with event: NSEvent) { mouse(with:event, index:5, type:0) }
override func otherMouseUp(with event: NSEvent) { mouse(with:event, index:5, type:0) }
override func mouseMoved(with event: NSEvent) { mouse(with:event, index:6, type:1) }
override func mouseDragged(with event: NSEvent) { mouse(with:event, index:6, type:1) }
override func rightMouseDragged(with event: NSEvent) { mouse(with:event, index:6, type:1) }
override func otherMouseDragged(with event: NSEvent) { mouse(with:event, index:6, type:1) }
override func scrollWheel(with event: NSEvent)
{
var thepoint:NSPoint
var button = 0;
thepoint = event.locationInWindow
if (event.deltaY > 0.2) { button = 4; }
if (event.deltaY < -0.2) { button = 5; }
if (event.deltaX > 0.2) { button = 6; }
if (event.deltaX < -0.2) { button = 7; }
if (button != 0 && eventFuncts[4] != nil)
{
_ = unsafeBitCast(eventFuncts[4],to:(@convention(c)(Int32, Int32, Int32, UnsafeRawPointer)->Int32).self)(Int32(button), Int32(thepoint.x), Int32(thepoint.y), eventParams[4])
}
}
override func flagsChanged(with event: NSEvent)
{
var flag:UInt32
var the_key:Int32
var val:UInt32
flag = UInt32(event.modifierFlags.rawValue)
val = (keyflag|flag)&(~(keyflag&flag))
if (val == 0)
{ return } /// no change - can happen when loosing focus on special key pressed, then re-pressed later
the_key = 1
while (((val >> (the_key-1)) & 0x01)==0)
{ the_key += 1 }
if (flag > keyflag && eventFuncts[2] != nil)
{ _ = unsafeBitCast(eventFuncts[2],to:(@convention(c)(Int32, UnsafeRawPointer)->Int32).self)(0xFF+the_key, eventParams[2]) }
if (flag < keyflag && eventFuncts[3] != nil)
{ _ = unsafeBitCast(eventFuncts[3],to:(@convention(c)(Int32, UnsafeRawPointer)->Int32).self)(0xFF+the_key, eventParams[3]) }
keyflag = flag
}
@objc func exposeNotification(_ notification:Notification)
{
if (eventFuncts[12] != nil)
{
_ = unsafeBitCast(eventFuncts[12],to:(@convention(c)(UnsafeRawPointer)->Int32).self)(eventParams[12])
}
}
@objc func closeNotification(_ notification:Notification)
{
if (eventFuncts[17] != nil)
{
_ = unsafeBitCast(eventFuncts[17],to:(@convention(c)(UnsafeRawPointer)->Int32).self)(eventParams[17])
}
}
@objc func deminiaturizeNotification(_ notification:Notification)
{
exposeNotification(notification)
}
}
struct textureList
{
var uniformBuffer: MTLBuffer!
var uniform_data:UnsafeMutablePointer<Float>
unowned var image:MlxImg
}
public class MlxWin
{
let vrect: CGRect
var winE: WinEvent
var mlayer: CAMetalLayer
unowned var device: MTLDevice
var commandQueue: MTLCommandQueue!
var pipelineState: MTLRenderPipelineState!
var vertexBuffer: MTLBuffer!
var texture_list: Array<textureList> = Array()
var texture_list_count = 0
var pixel_image:MlxImg
var pixel_count:Int
var drawable_image: MlxImg
var uniq_renderPassDescriptor: MTLRenderPassDescriptor
var mtl_origin_null : MTLOrigin
var mtl_size_all : MTLSize
var doClear = false
var GPUbatch = 0
public init(device d:MTLDevice, width w:Int, height h:Int, title t:String)
{
vrect = CGRect(x: 100, y: 100, width: w, height: h)
winE = WinEvent(frame: vrect)
device = d
mlayer = CAMetalLayer()
mlayer.device = device
mlayer.pixelFormat = .bgra8Unorm
mlayer.framebufferOnly = true
mlayer.contentsScale = 1.0 /// winE.screen!.backingScaleFactor
mlayer.frame = vrect
winE.contentView! = NSView(frame: vrect)
winE.contentView!.wantsLayer = true
winE.contentView!.layer = mlayer
winE.title = t
winE.isReleasedWhenClosed = false
winE.makeKeyAndOrderFront(nil)
/// drawable_image = MlxImg(d: device, w:Int(CGFloat(vrect.size.width)*winE.screen!.backingScaleFactor), h:Int(CGFloat(vrect.size.height)*winE.screen!.backingScaleFactor), t:1)
drawable_image = MlxImg(d: device, w:Int(vrect.size.width), h:Int(vrect.size.height), t:1)
pixel_image = MlxImg(d: device, w:Int(vrect.size.width), h:Int(vrect.size.height))
for i in 0...(pixel_image.texture_height*pixel_image.texture_sizeline/4-1)
{ pixel_image.texture_data[i] = UInt32(0xFF000000) }
pixel_count = 0
mtl_origin_null = MTLOriginMake(0,0,0)
mtl_size_all = MTLSizeMake(drawable_image.texture.width, drawable_image.texture.height, 1)
uniq_renderPassDescriptor = MTLRenderPassDescriptor()
uniq_renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColor(red: 0.0, green: 0.0, blue: 0.0, alpha:0.0)
uniq_renderPassDescriptor.colorAttachments[0].texture = drawable_image.texture
uniq_renderPassDescriptor.colorAttachments[0].storeAction = .store
uniq_renderPassDescriptor.colorAttachments[0].loadAction = .load
}
/// winEvent calls
public func getWinEFrame() -> NSRect { return winE.frame }
public func getScreenFrame() -> NSRect { return winE.screen!.frame }
public func getMouseLoc() -> NSPoint { return winE.mouseLocationOutsideOfEventStream }
public func addHook(index idx:Int, fct fptr:UnsafeMutableRawPointer, param pptr:UnsafeMutableRawPointer)
{ winE.addHook(index: idx, fct: fptr, param: pptr) }
public func setKeyRepeat(_ mode:Int) { winE.setKeyRepeat(mode) }
public func destroyWinE() { winE.close() }
public func setNotifs() { winE.setNotifs() }
public func delNotifs() { winE.delNotifs() }
public func initMetal()
{
commandQueue = device.makeCommandQueue()!
/// vertex buffer & shaders stay the always the same.
let lib = try! device.makeLibrary(source: shaders, options: nil)
let vertexFunction = lib.makeFunction(name: "basic_vertex_function")
let fragmentFunction = lib.makeFunction(name: "basic_fragment_function")
let pipelineDesc = MTLRenderPipelineDescriptor()
pipelineDesc.colorAttachments[0].pixelFormat = .bgra8Unorm
pipelineDesc.colorAttachments[0].isBlendingEnabled = true
pipelineDesc.colorAttachments[0].rgbBlendOperation = .add
pipelineDesc.colorAttachments[0].alphaBlendOperation = .add
pipelineDesc.colorAttachments[0].sourceRGBBlendFactor = .oneMinusSourceAlpha
pipelineDesc.colorAttachments[0].sourceAlphaBlendFactor = .oneMinusSourceAlpha
pipelineDesc.colorAttachments[0].destinationRGBBlendFactor = .sourceAlpha
pipelineDesc.colorAttachments[0].destinationAlphaBlendFactor = .sourceAlpha
pipelineDesc.vertexFunction = vertexFunction
pipelineDesc.fragmentFunction = fragmentFunction
pipelineState = try! device.makeRenderPipelineState(descriptor: pipelineDesc)
let vertexData: [Float] = [
-1.0, -1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0,
-1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0,
1.0, -1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0,
1.0, -1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0,
-1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0,
1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0 ]
var dataSize = vertexData.count * MemoryLayout.size(ofValue: vertexData[0])
vertexBuffer = device.makeBuffer(bytes: vertexData, length: dataSize, options: [])
let uniformData: [Float] = [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Float(vrect.size.width), Float(vrect.size.height), 0.0, 0.0, 0.0, 0.0,
1.0, 1.0, 1.0, 1.0 ]
dataSize = uniformData.count * MemoryLayout.size(ofValue: uniformData[0])
for _ in 0...255
{
let uniformBuffer = device.makeBuffer(bytes: uniformData, length: dataSize, options: [])!
let uniform_data = (uniformBuffer.contents()).assumingMemoryBound(to:Float.self)
texture_list.append(textureList(uniformBuffer:uniformBuffer, uniform_data:uniform_data, image:pixel_image))
}
self.clearWin();
}
public func clearWin()
{
/// discard previous put_images, doClear become first operation in next render pass.
var i = 0
while i < texture_list_count
{
texture_list[i].image.onGPU -= 1
i += 1
}
texture_list_count = 0
doClear = true
/// next flush images should call draw(), even if there is no image to put
}
func flushPixels()
{
if (pixel_count > 0)
{
pixel_count = 0
self.putImage(image:pixel_image, x:0, y:0)
}
}
public func flushImages()
{
flushPixels()
if (texture_list_count > 0 || doClear)
{
self.draw()
}
}
public func waitForGPU()
{
while (GPUbatch > 0) { }
}
public func pixelPut(_ x:Int32, _ y:Int32, _ color:UInt32)
{
if (pixel_count == 0)
{
while (pixel_image.onGPU > 0)
{
if (GPUbatch > 0) { waitForGPU() }
else { flushImages() }
}
for i in 0...pixel_image.texture_height*pixel_image.texture_sizeline/4-1
{ pixel_image.texture_data[i] = UInt32(0xFF000000) }
}
let t = (x&(Int32(vrect.size.width-1)-x))&(y&(Int32(vrect.size.height-1)-y))
if t >= 0
{
pixel_image.texture_data[Int(y)*pixel_image.texture_sizeline/4+Int(x)] = color
pixel_count += 1
}
}
public func putImage(image img:MlxImg, x posx:Int32, y posy:Int32)
{
flushPixels()
putImageScale(image:img, sx:0, sy:0, sw:Int32(img.texture_width), sh:Int32(img.texture_height),
dx:posx, dy:posy, dw:Int32(img.texture_width), dh:Int32(img.texture_height),
c:UInt32(0xFFFFFFFF))
}
public func putImageScale(image img:MlxImg, sx src_x:Int32, sy src_y:Int32, sw src_w:Int32, sh src_h:Int32, dx dest_x:Int32, dy dest_y:Int32, dw dest_w:Int32, dh dest_h:Int32, c color:UInt32)
{
flushPixels()
if (texture_list_count == 0) /// means I just draw
{
waitForGPU() /// to be able to write again in uniforms
}
texture_list[texture_list_count].uniform_data[0] = Float(img.texture_width)
texture_list[texture_list_count].uniform_data[1] = Float(img.texture_height)
texture_list[texture_list_count].uniform_data[2] = Float(src_x)
texture_list[texture_list_count].uniform_data[3] = Float(src_y)
texture_list[texture_list_count].uniform_data[4] = Float(src_w)
texture_list[texture_list_count].uniform_data[5] = Float(src_h)
texture_list[texture_list_count].uniform_data[8] = Float(dest_x)
texture_list[texture_list_count].uniform_data[9] = Float(dest_y)
texture_list[texture_list_count].uniform_data[10] = Float(dest_w)
texture_list[texture_list_count].uniform_data[11] = Float(dest_h)
texture_list[texture_list_count].uniform_data[12] = Float((color>>16)&0xFF)/255.0;
texture_list[texture_list_count].uniform_data[13] = Float((color>>8)&0xFF)/255.0;
texture_list[texture_list_count].uniform_data[14] = Float((color>>0)&0xFF)/255.0;
texture_list[texture_list_count].uniform_data[15] = Float((color>>24)&0xFF)/255.0;
texture_list[texture_list_count].image = img
img.onGPU += 1
texture_list_count += 1
if (texture_list_count == 255) /// keep 1 slot for put_pixels image
{
flushImages()
}
}
func draw()
{
var commandBuffer = commandQueue.makeCommandBuffer()!
/// clear if asked
if (doClear)
{
uniq_renderPassDescriptor.colorAttachments[0].loadAction = .clear
let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: uniq_renderPassDescriptor)!
commandEncoder.endEncoding()
uniq_renderPassDescriptor.colorAttachments[0].loadAction = .load
doClear = false
}
/// then draw the images if any.
var i = 0
while i < texture_list_count
{
let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: uniq_renderPassDescriptor)!
commandEncoder.setRenderPipelineState(pipelineState)
commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0)
commandEncoder.setVertexBuffer(texture_list[i].uniformBuffer, offset: 0, index: 1)
commandEncoder.setFragmentTexture(texture_list[i].image.texture, index: 0)
commandEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 6, instanceCount:2)
commandEncoder.endEncoding()
({ j in
commandBuffer.addCompletedHandler { cb in self.texture_list[j].image.onGPU -= 1 }
})(i)
i += 1
}
texture_list_count = 0
commandBuffer.addCompletedHandler { cb in self.GPUbatch -= 1 }
commandBuffer.commit()
GPUbatch += 1
/// finally copy to MTLdrawable to present, using a new commandqueue
commandBuffer = commandQueue.makeCommandBuffer()!
let curdraw = mlayer.nextDrawable()!
let commandBEncoder = commandBuffer.makeBlitCommandEncoder()!
commandBEncoder.copy(from:drawable_image.texture, sourceSlice:0, sourceLevel:0, sourceOrigin: mtl_origin_null, sourceSize: mtl_size_all, to:curdraw.texture, destinationSlice:0, destinationLevel:0, destinationOrigin: mtl_origin_null)
commandBEncoder.endEncoding()
commandBuffer.addCompletedHandler { cb in self.GPUbatch -= 1 }
commandBuffer.present(curdraw)
commandBuffer.commit()
GPUbatch += 1
}
}
let shaders = """
#include <metal_stdlib>
using namespace metal;
struct VertexIn {
float4 position;
float4 UV;
};
struct VertexOut {
float4 position [[ position ]];
float4 color;
float2 UV;
};
struct uniforms {
packed_float2 origin_size;
packed_float2 origin_pos;
packed_float2 origin_sub;
packed_float2 dest_size;
packed_float2 dest_pos;
packed_float2 dest_sub;
packed_float4 color;
};
vertex VertexOut basic_vertex_function(const device VertexIn *vertices [[ buffer(0) ]], constant uniforms& uni [[ buffer(1) ]],
uint vertexID [[ vertex_id ]])
{
VertexOut vOut;
float4 start = float4((2.0*uni.dest_pos.x)/(uni.dest_size.x-1.0) - 1.0, 1.0 - (2.0*uni.dest_pos.y)/(uni.dest_size.y-1.0) - (uni.dest_sub.y*2.0)/uni.dest_size.y, 0.0, 0.0);
/* vOut.position = (start + (vertices[vertexID].position + 1.0) * float4(uni.dest_sub, 0.0, 0.0))/float4(uni.dest_size, 1.0, 1.0); */
vOut.position = float4(start.x+((vertices[vertexID].position.x + 1.0)*uni.dest_sub.x)/(uni.dest_size.x),
start.y+((vertices[vertexID].position.y + 1.0)*uni.dest_sub.y)/(uni.dest_size.y), 0.0, 1.0);
vOut.UV = (uni.origin_pos + float2(vertices[vertexID].UV.x, vertices[vertexID].UV.y)*(uni.origin_sub-1.0))/(uni.origin_size-1.0);
vOut.color = uni.color;
return vOut;
}
fragment float4 basic_fragment_function(VertexOut vIn [[ stage_in ]], texture2d<float> texture [[ texture(0) ]])
{
constexpr sampler textureSampler(address::clamp_to_edge);
return vIn.color*texture.sample(textureSampler, vIn.UV);
}
"""

View File

@@ -1,384 +0,0 @@
// mlx xpm
// by ol
#include <stdlib.h>
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include "mlx.h"
typedef struct s_xpm_col
{
int name;
int col;
} t_xpm_col;
struct s_col_name
{
char *name;
int color;
};
//extern struct s_col_name mlx_col_name[];
#include "mlx_rgb.c"
#define RETURN { if (colors) free(colors); if (tab) free(tab); \
if (colors_direct) free(colors_direct); \
if (img) mlx_destroy_image(xvar, img); \
return ((void *)0); }
//
// str 2 wordtab & co
int mlx_int_str_str(char *str,char *find,int len)
{
int len_f;
int pos;
char *s;
char *f;
len_f = strlen(find);
if (len_f>len)
return (-1);
pos = 0;
while (*(str+len_f-1))
{
s = str;
f = find;
while (*(f++) == *(s++))
if (!*f)
return (pos);
str ++;
pos ++;
}
return (-1);
}
int mlx_int_str_str_cote(char *str,char *find,int len)
{
int len_f;
int pos;
char *s;
char *f;
int cote;
len_f = strlen(find);
if (len_f>len)
return (-1);
cote = 0;
pos = 0;
while (*(str+len_f-1))
{
if (*str=='"')
cote = 1-cote;
if (!cote)
{
s = str;
f = find;
while (*(f++) == *(s++))
if (!*f)
return (pos);
}
str ++;
pos ++;
}
return (-1);
}
char **mlx_int_str_to_wordtab(char *str)
{
char **tab;
int pos;
int nb_word;
int len;
len = strlen(str);
nb_word = 0;
pos = 0;
while (pos<len)
{
while (*(str+pos)==' ' || *(str+pos)=='\t')
pos ++;
if (*(str+pos))
nb_word ++;
while (*(str+pos) && *(str+pos)!=' ' && *(str+pos)!='\t')
pos ++;
}
if (!(tab = malloc((1+nb_word)*sizeof(*tab))))
return ((char **)0);
nb_word = 0;
pos = 0;
while (pos<len)
{
while (*(str+pos)==' ' || *(str+pos)=='\t')
{
*(str+pos) = 0;
pos ++;
}
if (*(str+pos))
{
tab[nb_word] = str+pos;
nb_word ++;
}
while (*(str+pos) && *(str+pos)!=' ' && *(str+pos)!='\t')
pos ++;
}
tab[nb_word] = 0;
return (tab);
}
// back to mlx_xpm
char *mlx_int_get_line(char *ptr,int *pos,int size)
{
int pos2;
int pos3;
int pos4;
if ((pos2 = mlx_int_str_str(ptr+*pos,"\"",size-*pos))==-1)
return ((char *)0);
if ((pos3 = mlx_int_str_str(ptr+*pos+pos2+1,"\"",size-*pos-pos2-1))==-1)
return ((char *)0);
*(ptr+*pos+pos2) = 0;
*(ptr+*pos+pos2+1+pos3) = 0;
pos4 = *pos+pos2+1;
*pos += pos2+pos3+2;
return (ptr+pos4);
}
char *mlx_int_static_line(char **xpm_data,int *pos,int size)
{
static char *copy = 0;
static int len = 0;
int len2;
char *str;
str = xpm_data[(*pos)++];
if ((len2 = strlen(str))>len)
{
if (copy)
free(copy);
if (!(copy = malloc(len2+1)))
return ((char *)0);
len = len2;
}
/* strcpy(copy,str); */
strlcpy(copy, str, len2+1);
return (copy);
}
int mlx_int_get_col_name(char *str,int size)
{
int result;
result = 0;
while (size--)
result = (result<<8)+*(str++);
return (result);
}
int mlx_int_get_text_rgb(char *name, char *end)
{
int i;
char buff[64];
if (*name == '#')
return (strtol(name+1,0,16));
if (end)
{
snprintf(buff, 64, "%s %s", name, end);
name = buff;
}
i = 0;
while (mlx_col_name[i].name)
{
if (!strcasecmp(mlx_col_name[i].name, name))
return (mlx_col_name[i].color);
i ++;
}
return (0);
}
void mlx_int_xpm_set_pixel(char *data, int opp, int col, int x)
{
*((unsigned int *)(data+4*x)) = col;
}
void *mlx_int_parse_xpm(void *xvar,void *info,int info_size,char *(*f)(), int *width, int *height)
{
int pos;
char *line;
char **tab;
char *data;
char *clip_data;
int nc;
int opp;
int sl;
int endian;
int cpp;
int col;
int rgb_col;
int col_name;
int method;
int x;
int i;
int j;
void *img;
t_xpm_col *colors;
int *colors_direct;
colors = 0;
colors_direct = 0;
img = 0;
tab = 0;
pos = 0;
if (!(line = f(info,&pos,info_size)) ||
!(tab = mlx_int_str_to_wordtab(line)) || !(*width = atoi(tab[0])) ||
!(*height = atoi(tab[1])) || !(nc = atoi(tab[2])) ||
!(cpp = atoi(tab[3])) )
RETURN;
free(tab);
tab = 0;
method = 0;
if (cpp<=2)
{
method = 1;
if (!(colors_direct = malloc((cpp==2?65536:256)*sizeof(int))))
RETURN;
}
else
if (!(colors = malloc(nc*sizeof(*colors))))
RETURN;
clip_data = 0;
i = nc;
while (i--)
{
if (!(line = f(info,&pos,info_size)) ||
!(tab = mlx_int_str_to_wordtab(line+cpp)) )
RETURN;
j = 0;
while (tab[j] && strcmp(tab[j++],"c"));
if (!tab[j])
RETURN;
rgb_col = mlx_int_get_text_rgb(tab[j], tab[j+1]);
if (method)
colors_direct[mlx_int_get_col_name(line,cpp)] = rgb_col;
else
{
colors[i].name = mlx_int_get_col_name(line,cpp);
colors[i].col = rgb_col;
}
free(tab);
tab = 0;
}
if (!(img = mlx_new_image(xvar,*width,*height)))
RETURN;
data = mlx_get_data_addr(img, &opp, &sl, &endian);
opp = 4;
i = *height;
while (i--)
{
if (!(line = f(info,&pos,info_size)))
RETURN;
x = 0;
while (x<*width)
{
col = 0;
col_name = mlx_int_get_col_name(line+cpp*x,cpp);
if (method)
col = colors_direct[col_name];
else
{
j = nc;
while (j--)
if (colors[j].name==col_name)
{
col = colors[j].col;
j = 0;
}
}
if (col==-1)
col = 0xFF000000;
mlx_int_xpm_set_pixel(data, opp, col, x);
x ++;
}
data += sl; //img->width*4;
}
if (colors)
free(colors);
if (colors_direct)
free(colors_direct);
return (img);
}
void mlx_int_file_get_rid_comment(char *ptr, int size)
{
int com_begin;
int com_end;
while ((com_begin = mlx_int_str_str_cote(ptr,"/*",size))!=-1)
{
com_end = mlx_int_str_str(ptr+com_begin+2,"*/",size-com_begin-2);
memset(ptr+com_begin,' ',com_end+4);
}
while ((com_begin = mlx_int_str_str_cote(ptr,"//",size))!=-1)
{
com_end = mlx_int_str_str(ptr+com_begin+2,"\n",size-com_begin-2);
memset(ptr+com_begin,' ',com_end+3);
}
}
void *mlx_xpm_file_to_image(void *xvar,char *file,int *width,int *height)
{
int fd;
int size;
char *ptr;
void *img;
if ((fd = open(file,O_RDONLY))==-1 || (size = lseek(fd,0,SEEK_END))==-1 ||
(ptr = mmap(0,size,PROT_WRITE|PROT_READ,MAP_PRIVATE,fd,0))==
(void *)MAP_FAILED)
{
if (fd>=0)
close(fd);
return ((void *)0);
}
mlx_int_file_get_rid_comment(ptr, size);
img = mlx_int_parse_xpm(xvar,ptr,size,mlx_int_get_line, width, height);
munmap(ptr,size);
close(fd);
return (img);
}
void *mlx_xpm_to_image(void *xvar,char **xpm_data,int *width,int *height)
{
return (mlx_int_parse_xpm(xvar,xpm_data,0,mlx_int_static_line, width, height));
}

View File

@@ -0,0 +1,21 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
1111111111 111 1111111
1111111111 111 1111111
1111111111 1111111
111 1000000001111111000001
1011 1000000001111111000001
111 1000N00001111111111111
10000000011111111
10000000011111111 111
10000000011111111
111111111011111111111111111111
10000110001 111 1000000011111111111111
10000000011 111 110000011111
11111111111 111111111111

View File

@@ -0,0 +1,21 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
1111111111 111 1111111
1111111111 111 1111111
1111111111 1111111
111 1000000001111111000001
1011 1000000001111111000001
111 1000000001111111111111
10000000011111111
10000000011111111 111
10000000011111111
111111111011111111111111111111
10000110001 111 1000000011111111111111
10000000011 111 110000011111
11111111111 111111111111

View File

@@ -0,0 +1,17 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
1111111111 1111111
111 1000000001111000001
101 100S000001111000001
111 1000000001111000001111
10000S0001111000001001
11111111100000000111100000111111
100001100010000000011111111111
10000000011110000011
11111111111111111111

View File

@@ -0,0 +1,17 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
1111111111 1111111
111 1111111111111111111
1S1 111S111111111111111
111 1111111111111111111111
1111111111111111111111
11111111111111111111111111111111
111111111111111111111111111111
11111111111111111111
11111111111111111111

View File

@@ -0,0 +1,17 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
1111111111 1111111
111 1000000001111000001
101 100S00000000000W001
111 10000000000N0000001111
10S000000000000000W001
111111111000000000000000W0000111
100000000000E00000011111111111
10N0000000000000E001
11111111111111111111

View File

@@ -0,0 +1,22 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
1111111111 1 1111111
1111111111 1 1111111
1111111111 1 1111111
10000000011111000001
10000S00011111000001
10000000011111000001111
10000000011111000001001
1111111111 1111111111
1111111111 1111111
111111111000000001111100000111111
1000011000100000000111111111111
10000000011110000011
11111111111111111111

View File

@@ -0,0 +1,19 @@
NO ./textures/wrong_texture.xpm
SO ./textures/brick.xpm
WE ./textures/dickbutt.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
1111111111 11 1111111
1111111111 11 1111111
1111111111 1111111111
100000000111111000001
100000000111111000001
1000E0000111111000001111
100000000111111000001001
1111111110000000011111100000111111
1000011000100000000111111111111
10000000011110000011
11111111111111111111

View File

@@ -0,0 +1,35 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
11111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111 11111111 1 1 1 1 11111111
1111111111 11111111111111 111 1 1 1 1 111111
11111 111111111111111111 1111 1 1 1 1 111
11111 1111 111111111111111111 11111 1 1 1 1 11
11111 1111111111 11111 11111111111111111111111
111 1111111 11111 1111111 11111111111111111
111 1111 1111 11111 1111111 11111111111111111
111 1111 1111111 111111 1111111111111111111111
111 1111111111111111111111 1111111111111
11111111111111111111111111111111111111111111
1111111111111 11111111 11111
1111 111 111 1111 1 1111
1111111 111111111111 111 111
1111 111 111 11 11111 11
1111111 111 111111 111 111
1111111111111111 1111 1 1111
111111 111111111111 11111
111111 11111111111111111111111
111111 11111111111
111111 11111 1111 111
11111111 111 11 111 11
11111111 111 11111 11 11
1111111111 1111 11111 1111 111
1111111111 11111 111
111111111111111 11111111111111

View File

@@ -0,0 +1,19 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
111111111111111111111111111
100000000000000000000000001
100000000000000000000000001
100000000000000000000000001
10000000000N000000000000001
100000000000000000000000001
100000000000000000000000001
100000000000000000000000001
100000000000000000000000001
111111111111111111111111111
C 33,33,33

View File

@@ -0,0 +1,21 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
..........1111111111.111.1111111........
..........1111111111.111.1111111........
..........1111111111.....1111111........
..111 111.1000000001111111000001........
..101111..1000000001111111000001........
..111.....10000N0001111111111111........
..........10000000011111111.............
..........10000000011111111..111........
..........10000000011111111.............
111111111111111111111111111111..........
10000110001.111.1000000011111111111111..
10000000011.111.110000011111............
11111111111.....111111111111............

View File

@@ -0,0 +1,20 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
11111111111
11000000011
10100200101
10010001001
10001010001
10200N00201
10001010001
10010001001
10100200101
11000000011
11111111111

View File

@@ -0,0 +1,20 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
11111111111
11000000011
10100 00101
10010001001
10001010001
10 00N00 01
10001010001
10010001001
10100 00101
11000000011
11111111111

View File

@@ -0,0 +1,18 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
1111111111 1111111
111 1000000001111000001
101 100S000001111000001
111 1000000001111000001111
1000000001111000001001
11111111100000000111100000111111
100001100010000000011111111111
10000000011110000011
11111111111111111111

View File

@@ -0,0 +1,22 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
111111111111111111111111111111
100000000000000000000000000001
100000000000000000000000000001
100000000000000000011111100001
10000000000000000001 10001
10000000000000000001 11 1001
10000000000000000001 111 111
10000000000000000001
100000000000000000011111111111
10000000000E000000000000000001
100000000000000000000000000001
100000000000000000000000000001
111111111111111111111111111111

View File

@@ -0,0 +1,22 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
11
101
101
1N1
101
101
101
101
101
101
101
101
101
11

View File

@@ -0,0 +1,35 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
11111111111111111111111111111111111111111111111111111111111
10000000011111111111100000000000011 11111111 1 1 1 1 11111111
1000111111 10000000000001 111 1 1 1 1 101111
10001 100000000000011111 1101 1 1 1 1 111
10001 1111 101111111111111111 11001 1 1 1 1 11
10111 1111111111 11101 11000111111111111111111
101 1001111 10001 1111111 11111111110000001
101 1111 1001 11111 1000011 11111000000000001
101 1111 1001111 100001 1000000000001111111111
101 1000001111111111100001 1000001111111
10111111110011111000000111000111111111111111
1001111111111 11111111 11001
1001 111 111 1111 1 1101
1001111 111111111111 111 111
1001 111 111 11 11111 11
1001111 111 111111 111 111
1000011111111111 1011 1 1101
100001 100111110011 11001
100001 11111100001111111111111
100N01 11110001111
100001 11101 1111 111
10000111 101 11 111 11
10000001 101 11111 11 11
1000000011 1111 10001 1111 111
1000000001 10001 101
111111111111111 11111111111111

View File

@@ -0,0 +1,22 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
111111111111111111111111111111
100000000000000000000000000001
1000S0000000000000000000000001
10000000000000111111111111111
100000000000001
100000000000001 1111111 11111
100000000000001 1 11 10001
100000000000001 1 110001
100000000000001111111111110001
100000000000000000000000000001
100000000000000000000000000001
100000000000000000000000000001
111111111111111111111111111111

View File

@@ -0,0 +1,17 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
C 33,33,33
1111111111111111111111111
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1000000000N00000000000001
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1111111111111111111111111

View File

@@ -0,0 +1,17 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
EA ./textures/blue.xpm
C 33,33,33
F 66,66,66
1111111111111111111111111
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1000000000N00000000000001
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1111111111111111111111111

View File

@@ -0,0 +1,19 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
C 33,33,33
F 66,66,66
C 33,33,33
1111111111111111111111111
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1000000000N00000000000001
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1111111111111111111111111

View File

@@ -0,0 +1,19 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
NO ./textures/grey.xpm
C 33,33,33
F 66,66,66
1111111111111111111111111
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1000000000N00000000000001
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1111111111111111111111111

View File

@@ -0,0 +1,18 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
C 3 3,33,33
F 66,66,66
1111111111111111111111111
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1000000000N00000000000001
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1111111111111111111111111

View File

@@ -0,0 +1,18 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
DLWIJdw ifejwlf elwfj sd.fwef
EA ./textures/blue.xpm
C 33,33,33
F 66,66,66
1111111111111111111111111
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1000000000N00000000000001
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1111111111111111111111111

View File

@@ -0,0 +1,27 @@
NO textures/coin.xpm
SO textures/chalice.xpm
EA textures/brick.xpm
WE textures/wood.xpm
F 220, 100, 30
C 225, 30, 0
1111111111111111111111111111
10000000000000000111W0000001
1111000000000000100000110001
1111001000000000000110000111
1000000000000000010101000001
1111110000000000000000001111
1000000000000000000000000001
1000000000000000000000000001
1000000000000000000000000001
1000000000000000000000000001
1000000000000000000000000001
1000000000000000000000000001
1000000000000000000000000001
1000000000000000000000000001
1000000000000000000000000001
1000000000000000000000000001
1000000000000000000000000001
1111111111111111111111111111

View File

@@ -0,0 +1,32 @@
NO textures/grey.xpm
SO textures/grey.xpm
EA textures/grey.xpm
WE textures/grey.xpm
F 66,66,66
C 33,33,33
111111111111111111111111
1......................1
1......................1
1......................1
1.......1......1.1.1...1
1.....1...1............1
1.......1......1...1...1
1.....1...1....E.......1
1.......1......1.1.1...1
1......................1
1......................1
1......................1
1......................1
1......................1
1.......11.............1
1.......11.............1
111111..11............11
11.1....11.............1
11....1.11............11
11.1....11.............1
11.1111111............11
11...................111
1111111111..........1111
111111111111111111111111

View File

@@ -0,0 +1,32 @@
NO textures/coin.xpm
SO textures/coin.xpm
EA textures/coin.xpm
WE textures/coin.xpm
F 66,66,66
C 33,33,33
111111111111111111111111
1......................1
1......................1
1......................1
1.....11111....1.1.1...1
1.....1...1............1
1.....1...1....1...1...1
1.....1...1....E.......1
1.....11.11....1.1.1...1
1......................1
1......................1
1......................1
1......................1
1......................1
1.......11.............1
1.......11.............1
111111..11............11
11.1....11.............1
11....1.11............11
11.1....11.............1
11.1111111............11
11...................111
1111111111..........1111
111111111111111111111111

View File

@@ -0,0 +1,22 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 220,100,0
C 225,30,0
1111111111111111111111111
1000000000110000000000001
1011000001110000000000001
1001000000000000000000001
111111111011000001110000000000001
100000000011000001110111111111111
11110111111111011100000010001
11110111111111011101010010001
11000000110101011100000010001
10000000000000001100000010001
10000000000000001101010010001
11000001110101011111011110N0111
11110111 1110101 101111010001
11111111 1111111 111111111111

View File

@@ -0,0 +1,17 @@
NO textures/coin.xpm
SO textures/coin.xpm
EA textures/coin.xpm
WE textures/coin.xpm
F 220, 100, 30
C 225, 30, 0
11111111111111111111
10000000011100000001
11110000100000110001
11110010000110000111
10000000010101000001
11111100000000001111
10000000000N00000001
10000000000000000001
11111111111111111111

View File

@@ -0,0 +1,26 @@
NO textures/coin.xpm
SO textures/coin.xpm
EA textures/coin.xpm
WE textures/coin.xpm
F 220 , 100, 30
C 225 , 30 , 0
11111111111111111111
10000110000001110011
11100000000000000001
10101111111111111111
111111111110001
100000000000001 1111111111111
111100000000001 11 10000011111
1000000N0001111 100001111111
11100000010000111111100100000001
100000000000000000000000011011011
100111100111100111100111001011001
1111 11111 11111 111111001111101
11100111101
110011101
11001101
1100101
110001
11111

View File

@@ -0,0 +1,32 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66, 66 , 66
C 33 , 55 , 33
111111111111111111111111
100000000000000000000001
100000000000000000000001
100000000000000000000001
100000111110000101010001
100000100010000000000001
100000100010000100010001
100000100010000E00000001
100000110110000101010001
100000000000000000000001
100000000000000000000001
100000000000000000000001
100000000000000000000001
100000000000000000000001
100000001100000000000001
100000001100000000000001
111111001100000000000011
110100001100000000000001
110000101100000000000011
110100001100000000000001
110111111100000000000011
110000000000000000000111
111111111100000000001111
111111111111111111111111

View File

@@ -0,0 +1,17 @@
NO textures/coin.xpm
SO textures/coin.xpm
EA textures/coin.xpm
WE textures/coin.xpm
F 220, 100, 30
C 225, 30, 0
11111111111111111111
10000000011100000001
11110000100000110001
11110010000110000111
10000000010101000001
11111100000000001111
10000000000N00000001
10000000000000000001
11111111111111111111

View File

@@ -0,0 +1,17 @@
NO textures/coin.xpm
SO textures/coin.xpm
EA textures/coin.xpm
WE textures/coin.xpm
F 220, 100, 30
C 225, 30, 0
11111111111111111111
10000000011100000001
11110000100000110001
11110010000110000111
10000000010101000001
11111100000000001111
10000000000N00000001
10000000000000000001
11111111111111111111

View File

@@ -0,0 +1,17 @@
NO textures/coin.xpm
SO textures/coin.xpm
EA textures/coin.xpm
WE textures/coin.xpm
F 220, 100, 30
C 225, 30, 0
11111111111111111111
10000000011100000001
11110000100000110001
11110010000110000111
10000000010101000001
11111100000000001111
10000000000N00000001
10000000000000000001
11111111111111111111

View File

@@ -0,0 +1,14 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66 , 66 , 66
C 33 , 33 , 33
1111 1111111111 1111111111
1001 1000000001111000001
10011100000001111111000111
10000000000001 1000001
100N0011111001111 1110001
11111111111111111 111111111

View File

@@ -0,0 +1,18 @@
F 66,66,66
SO ./textures/brick.xpm
EA ./textures/blue.xpm
NO ./textures/grey.xpm
C 33,33,33
WE ./textures/wood.xpm
1111111111111111111111111
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1000000000N00000000000001
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1111111111111111111111111

View File

@@ -0,0 +1,17 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
1111111111 1111111
1000000001111000001
1000000001111000001
1000E00001111000001111
1000000001111000001001
11111111100000000111100000111111
100001100010000000011111111111
10000000011110000011
11111111111111111111

View File

@@ -0,0 +1,17 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
1111111111111111111
1000111111111111111
1111111111111110001
1100000000000000000111
1111000000000000S00001
10000000000000000011111111111111
111111111111111111111000000001
10000000011111111111
11111111111111111111

View File

@@ -0,0 +1,47 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
C 33,33,33
F 66,66,66
1111111111111111111111111
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1000000000N00000000000001
1000000000000000000000001
1000000000000000000000001
1000000000000000000000001
1111111111111111111111111

View File

@@ -0,0 +1,24 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111111S11111111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111111111
111111111111111111 11111111
111111111111111111 111 11
111111111111111111111 11 11
111111111111111111111 1111 111
111111111111111111111 111
111111111111111111111111111111

View File

@@ -0,0 +1,59 @@
NO textures/door.xpm
SO textures/door.xpm
EA textures/door.xpm
WE textures/door.xpm
F 220, 100, 30
C 225, 30, 0
1111
10011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110S11
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
110011
11001
1111

View File

@@ -0,0 +1,56 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
111 11111111111111111111111111111111111111111111111
1N1 10000000000000000000000000000000000000000000001
101 10111111111111111111111111111111111111111111101
101 101 101
101 101 111111111111111111111111111111111111111 101
101 101 100000000000000000000000000000000000001 101
101 101 101111111111111111111111111111111111101 101
101 101 101 101 101
101 101 101 1111111111111111111111111111111 101 101
101 101 101 1000000000000000000000000000001 101 101
101 101 101 1011111111111111111111111111101 101 101
101 101 101 101 101 101 101
101 101 101 101 11111111111111111111111 101 101 101
101 101 101 101 10000000000000000000001 101 101 101
101 101 101 101 10111111111111111111101 101 101 101
101 101 101 101 101 101 101 101 101
101 101 101 101 101 111111111111111 101 101 101 101
101 101 101 101 101 100000000000001 101 101 101 101
101 101 101 101 101 101111111111101 101 101 101 101
101 101 101 101 101 101 101 101 101 101 101
101 101 101 101 101 101 1111111 101 101 101 101 101
101 101 101 101 101 101 1000001 101 101 101 101 101
101 101 101 101 101 101 101 101 101 101 101 101 101
101 101 101 101 101 101 111 101 101 101 101 101 101
101 101 101 101 101 101 101 101 101 101 101 101
101 101 101 101 101 10111111101 101 101 101 101 101
101 101 101 101 101 10000000001 101 101 101 101 101
101 101 101 101 101 11111111111 101 101 101 101 101
101 101 101 101 101 101 101 101 101 101
101 101 101 101 1011111111111111101 101 101 101 101
101 101 101 101 1000000000000000001 101 101 101 101
101 101 101 101 1111111111111111111 101 101 101 101
101 101 101 101 101 101 101 101
101 101 101 101111111111111111111111101 101 101 101
101 101 101 100000000000000000000000001 101 101 101
101 101 101 111111111111111111111111111 101 101 101
101 101 101 101 101 101
101 101 10111111111111111111111111111111101 101 101
101 101 10000000000000000000000000000000001 101 101
101 101 11111111111111111111111111111111111 101 101
101 101 101 101
101 1011111111111111111111111111111111111111101 101
101 1000000000000000000000000000000000000000001 101
101 1111111111111111111111111111111111111111111 101
101 101
101111111111111111111111111111111111111111111111101
100000000000000000000000000000000000000000000000001
111111111111111111111111111111111111111111111111111

View File

@@ -0,0 +1,56 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
111111111111111111111111111
1N1000000000000000000000001
101011111111111111111111101
10101 101
101011111111111111111111101
101010000000000000000000101
101010111111111111111110101
1010101 10101
101010111111111111111110101
101010100000000000000010101
101010101111111111111010101
101010101 1010101
101010101111111111111010101
101010101000000000001010101
101010101011111111101010101
10101010101 101010101
101010101011111111101010101
101010101010000000101010101
101010101010111110101010101
1010101010101 10101010101
101010101010111110101010101
101010101010100010101010101
101010101010101010101010101
101010101010111010101010101
1010101010101 1010101010101
101010101010111010101010101
101010101010000010101010101
101010101011111110101010101
10101010101 10101010101
101010101011111110101010101
101010101000000000101010101
101010101111111111101010101
101010101 101010101
101010101111111111101010101
101010100000000000001010101
101010111111111111111010101
1010101 1010101
101010111111111111111010101
101010000000000000000010101
101011111111111111111110101
10101 10101
101011111111111111111110101
101000000000000000000000101
101111111111111111111111101
101 101
101111111111111111111111101
100000000000000000000000001
111111111111111111111111111

View File

@@ -0,0 +1,34 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
111111111111111111111111111
1N1000000000000000000000001
101011111111111111111111101
101010000000000000000000101
101010111111111111111110101
101010100000000000000010101
101010101111111111111010101
101010101000000000001010101
101010101011111111101010101
101010101010000000101010101
101010101010111110101010101
101010101010100010101010101
101010101010101010101010101
101010101010111010101010101
101010101010000010101010101
101010101011111110101010101
101010101000000000101010101
101010101111111111101010101
101010100000000000001010101
101010111111111111111010101
101010000000000000000010101
101011111111111111111110101
101000000000000000000000101
101111111111111111111111101
100000000000000000000000001
111111111111111111111111111

View File

@@ -0,0 +1,31 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
11111111111111111111111111111111111111111111111111111111111111111
10000000000000000001111111111111111111111111111111111111111111111
11111111111111111100000000001111111111111111111111111111111111111
11111111111111111111111111100000000011111111111111111111111111111
11111111111111111111111111111111111000000001111111111111111111111
11111111111111111111111111111111111111111100000001111111111111111
11111111111111111111111111111111111111111111111100000011111111111
11111111111111111111111111111111111111111111111111111000001111111
11111111111111111111111111111111111111111111111111111111100001111
11111111111111111111111111111111111111111111111111111111111100011
11111111111111111111111111111111111111111111111111111111111111001
111111111111111111111111111111111111111111111111111111111111111W1
11111111111111111111111111111111111111111111111111111111111111001
11111111111111111111111111111111111111111111111111111111111100011
11111111111111111111111111111111111111111111111111111111100001111
11111111111111111111111111111111111111111111111111111000001111111
11111111111111111111111111111111111111111111111100000011111111111
11111111111111111111111111111111111111111100000001111111111111111
11111111111111111111111111111111111000000001111111111111111111111
11111111111111111111111111100000000011111111111111111111111111111
11111111111111111100000000001111111111111111111111111111111111111
10000000000000000001111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111

View File

@@ -0,0 +1,61 @@
NO ./textures/grey.xpm
SO ./textures/brick.xpm
WE ./textures/wood.xpm
EA ./textures/blue.xpm
F 66,66,66
C 33,33,33
11111111111111111111111111
1111111100000000000000000000000011111111
111110000000011111111111011111111110000000011111
11111000001111111100000000000000000000111111110000011111
11110000011111000000000000000000000000000000000011111000001111
111000011011000000000000000000000000000000000000000000110110000111
1110001111000000000000000000000000000000000000000000000000001111000111
11100011100000000000000000000000000000000000000000000000000000000111000111
111000111000000000000000000000000000000000000000000000000000000000000111000111
1110001110000000000000000000000000000000000000000000000000000000000000000111000111
110001110000000000000000000000000000000000000000000000000000000000000000000011100011
11001110000000000000000000000000000000000000000000000000000000000000000000000001110011
1100110000000000000000000000000000000000000000000000000000000000000000000000000000110011
110011000000000000000000000000000000000000000000000000000000000000000000000000000000110011
11001100000000000000000000000000000000000000000000000000000000000000000000000000000000110011
1100110000000000000000000000000000000000000000000000000000000000000000000000000000000000110011
110011000000000000000000000000000000000000000000000000000000000000000000000000000000000000110011
100110000000000000000000000000000000000000000000000000000000000000000000000000000000000000011001
11011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011011
10010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001
10110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001101
1101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001011
1001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001
1011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001101
1010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101
1010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101
10000000000000000000000000000000000000000000000000S0000000000000000000000000000000000000000000000001
1010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101
1010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101
1011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001101
1001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001
1101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001011
10110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001101
10010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001101
11011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011001
1001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000110011
110011000000000000000000000000000000000000000000000000000000000000000000000000000000000000110011
1100110000000000000000000000000000000000000000000000000000000000000000000000000000000000110011
11001100000000000000000000000000000000000000000000000000000000000000000000000000000000110011
110011000000000000000000000000000000000000000000000000000000000000000000000000000000110011
1100110000000000000000000000000000000000000000000000000000000000000000000000000000110011
11001110000000000000000000000000000000000000000000000000000000000000000000000001110011
110001110000000000000000000000000000000000000000000000000000000000000000000011100011
1110001110000000000000000000000000000000000000000000000000000000000000000111000111
111000111000000000000000000000000000000000000000000000000000000000000111000111
11100011100000000000000000000000000000000000000000000000000000000111000111
1110001111000000000000000000000000000000000000000000000000001111000111
111000011011000000000000000000000000000000000000000000110110000111
11110000011111000000000000000000000000000000000011111000001111
11111000001111111100000000000000000000111111110000011111
111110000000011111111111011111111110000000011111
1111111100000000000000000000000011111111
11111111111111111111111111

104
notes.md Normal file
View File

@@ -0,0 +1,104 @@
# run
**add minilibx and libft submodules :**
- git submodule init
- git submodule update
# todo
- resolve view buble
- add textures
# ressources
- [tuto mlx](https://harm-smits.github.io/42docs/libs/minilibx/getting_started.html)
- [tuto raycasting](https://lodev.org/cgtutor/raycasting.html)
- [tuto raycasting js](http://www.playfuljs.com/a-first-person-engine-in-265-lines)
- [tuto mlx and wolf3d](https://github.com/qst0/ft_libgfx)
- [tuto mlx images](https://github.com/keuhdall/images_example)
- [bmp images](https://web.archive.org/web/20080912171714/http://www.fortunecity.com/skyscraper/windows/364/bmpffrmt.html)
- [bmp images in c](https://stackoverflow.com/questions/2654480/writing-bmp-image-in-pure-c-c-without-other-libraries)
---
# keys numbers
```
+-------------.-------.-------+------.-------.-------+------.-------.-------+
| keys linux mac | keys linux mac | keys linux mac |
|-------------.-------.-------|------.-------.-------|------.-------.-------+
| direction keys | alpha keys | num keys |
|-------------.-------.-------|------.-------.-------|------.-------.-------+
| w forward . 119 . _____ | a . 97 . _____ | & (0). (38) . _____ |
| a left . 97 . _____ | b . 98 . _____ | é (1). (233) . _____ |
| s backward . 115 . _____ | c . 99 . _____ | " (2). (34) . _____ |
| d right . 100 . _____ | d . 100 . _____ | ' (3). (39) . _____ |
|-------------.-------.-------| e . 101 . _____ | ( (4). (40) . _____ |
| arrows keys | f . 102 . _____ | - (5). (45) . _____ |
|-------------.-------.-------| g . 103 . _____ | è (6). (232) . _____ |
| ← . 65361 . _____ | h . 104 . _____ | _ (7). (95) . _____ |
| → . 65363 . _____ | i . 105 . _____ | ç (8). (231) . _____ |
| ↓ . 65364 . _____ | j . 106 . _____ | à (9). (224) . _____ |
| ↑ . 65362 . _____ | k . 107 . _____ |------.-------.-------|
|-------------.-------.-------| l . 108 . _____ | other keys |
| special keys | m . 109 . _____ |------.-------.-------|
|-------------.-------.-------| n . 110 . _____ | < (>). 60 . _____ |
| esc . 65307 . _____ | o . 111 . _____ | > .(60) . _____ |
| suppr . 65535 . _____ | p . 112 . _____ | space. 32 . _____ |
| delete . 65288 . _____ | q . 113 . _____ | tab . 65289 . _____ |
| enter . 65293 . _____ | r . 114 . _____ | = (+). 61 . _____ |
|-------------.-------.-------| s . 115 . _____ | + .(61) . _____ |
| hot keys | t . 116 . _____ | - . 45 . _____ |
|-------------.-------.-------| u . 117 . _____ | . . |
| shift left . 65505 . _____ | v . 118 . _____ | . . |
| shift right . 65506 . _____ | w . 119 . _____ | . . |
| ctrl left . 65507 . _____ | x . 120 . _____ | . . |
| ctrl right . 65508 . _____ | y . 121 . _____ | . . |
| . . | z . 122 . _____ | . . |
+-------------.-------.-------+------.-------.-------+------.-------.-------+
```
---
# hook key masks
- https://tronche.com/gui/x/xlib/events/keyboard-pointer/keyboard-pointer.html
```
x_event | x_mask | action
-------------------------------------------------
2 | 1L << 0 | key press
3 | 1L << 1 | key release
4 | | mouse press
5 | | mouse release
6 | | mouse move
12 | | expose event
17 | 1L << 17 | x button press (red button)
```
---
# fonctions externes autorisees :
- **open**
- **close**
- **read**
- **write**
- **malloc**
- **free**
- **perror**
- **strerror**
- **exit**
- **math lib** :
- **lm** -> needed at compilation to link the lib (eg: `gcc foo.c -o foo -lm`)
- **man**
- **man 3 math**
- **minilibx** :
- `minilibx_opengl.tgz`
- `minilibx_mms_20200219_beta.tgz`
- **to open an archive.tgz** :
- `gzip -d archive.tgz` -> turn it into archive.tar
- `tar -xf archive.tar` -> un-archive it
- how to add a man directory to the manual :
- cp man/man1 /usr/local/share/man/man1 (create man1 if necessary)
- mandb
- i didn't use any of both library above but the one for linux : https://github.com/42Paris/minilibx-linux (there are pbm with their man pages)

View File

@@ -1,3 +1,15 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* cube3d.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: pblagoje <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/05/04 13:42:00 by pblagoje #+# #+# */
/* Updated: 2022/05/04 21:58:13 by hulamy ### ########.fr */
/* */
/* ************************************************************************** */
#include "cube3d.h" #include "cube3d.h"
void destroy_mlx(void *param) void destroy_mlx(void *param)
@@ -5,43 +17,49 @@ void destroy_mlx(void *param)
t_game *game; t_game *game;
game = param; game = param;
if (game->fd != -1)
// tmp, to draw map close(game->fd);
mlx_destroy_image(game->mlx_ptr, game->map_img.ptr); if (game->mlx_ptr == NULL)
mlx_destroy_window(game->mlx_ptr, game->map_win.ptr); return ;
// tmp end if (game->img.ptr)
mlx_destroy_image(game->mlx_ptr, game->img.ptr);
mlx_destroy_image(game->mlx_ptr, game->img.ptr); if (game->txt.img_n.ptr)
mlx_destroy_window(game->mlx_ptr, game->win.ptr); mlx_destroy_image(game->mlx_ptr, game->txt.img_n.ptr);
if (game->txt.img_s.ptr)
mlx_destroy_image(game->mlx_ptr, game->txt.img_s.ptr);
if (game->txt.img_e.ptr)
mlx_destroy_image(game->mlx_ptr, game->txt.img_e.ptr);
if (game->txt.img_w.ptr)
mlx_destroy_image(game->mlx_ptr, game->txt.img_w.ptr);
if (game->win.ptr)
mlx_destroy_window(game->mlx_ptr, game->win.ptr);
mlx_destroy_display(game->mlx_ptr); mlx_destroy_display(game->mlx_ptr);
} }
int shut_down(void) int shut_down(void)
{ {
mb_exit(B_RED"close windows"RESET"\n"); mb_exit(B_RED"close windows"RESET"\n", EXIT_SUCCESS);
return (0); return (0);
} }
int main(int ac, char **av) int main(int ac, char **av)
{ {
t_game *game; t_game *game;
game = init_game(); if ((ac != 2 || check_extension(av[1], ".cub")) && \
init_parsing(ac, av, game); write(2, "Error\nPlease use a valid .cub file as single argument.\n", 53))
return (EXIT_FAILURE);
game = init_struct();
mb_init(destroy_mlx, game); mb_init(destroy_mlx, game);
if (init_parsing(game, av[1]))
// draw game a first time before it start return (EXIT_FAILURE);
if (check_map(&(game->map)))
return (EXIT_FAILURE);
init_game(game);
draw(game); draw(game);
// receive a keypress event
mlx_hook(game->win.ptr, 2, 1L << 0, keypress, game); mlx_hook(game->win.ptr, 2, 1L << 0, keypress, game);
// receive a keyprelease event
mlx_hook(game->win.ptr, 3, 1L << 1, keyrelease, game); mlx_hook(game->win.ptr, 3, 1L << 1, keyrelease, game);
// receive event when clicking the red button to close the window
mlx_hook(game->win.ptr, 17, 1L << 17, shut_down, NULL); mlx_hook(game->win.ptr, 17, 1L << 17, shut_down, NULL);
// infinite loop that waits for events to occurs
mlx_loop_hook(game->mlx_ptr, hook_action, game); mlx_loop_hook(game->mlx_ptr, hook_action, game);
mlx_loop(game->mlx_ptr); mlx_loop(game->mlx_ptr);
return (0); return (0);

View File

@@ -1,3 +1,15 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* draw.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: pblagoje <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/05/04 13:55:29 by pblagoje #+# #+# */
/* Updated: 2022/05/04 13:55:31 by pblagoje ### ########.fr */
/* */
/* ************************************************************************** */
#include "cube3d.h" #include "cube3d.h"
static int pxl_out_limits(t_img *img, int x, int y) static int pxl_out_limits(t_img *img, int x, int y)
@@ -19,7 +31,7 @@ void draw_pixel(t_img *img, int x, int y, int color)
if (pxl_out_limits(img, x, y)) if (pxl_out_limits(img, x, y))
return ; return ;
position = y * img->szl + x * (img->bpp / 8); position = y * img->szl + x * (img->bpp / 8);
*(unsigned int*)(img->data + position) = color; *(unsigned int *)(img->data + position) = color;
} }
void draw_line(t_img *img, t_vec *vec, int color) void draw_line(t_img *img, t_vec *vec, int color)
@@ -42,102 +54,8 @@ void draw_line(t_img *img, t_vec *vec, int color)
} }
} }
// tmp
static void draw_square(t_game *game, t_coord pos, int border, int fill, int size, int rotation)
{
int i;
int j;
t_coord new;
i = 0;
while (i < size)
{
j = 0;
while (j < size)
{
new.x = pos.x + j;
new.y = pos.y + i;
if (rotation)
rotate(&(game->plr), &(new));
if (!i || i == size - 1)
draw_pixel(&game->map_img, new.x, new.y, border);
else if (!j || j == size - 1)
draw_pixel(&game->map_img, new.x, new.y, border);
else
draw_pixel(&game->map_img, new.x, new.y, fill);
j++;
}
i++;
}
}
static void draw_map(t_game *game)
{
t_coord incr;
t_coord pos;
int cell;
cell = game->map.cell;
incr.x = 0;
pos.x = 0;
pos.y = 0;
while ((game->map.content)[incr.x])
{
incr.y = 0;
while ((game->map.content)[incr.x][incr.y])
{
if ((game->map.content)[incr.x][incr.y] == '1' )
draw_square(game, pos, 0x00999999, 0x00000000, cell, 0);
else
draw_square(game, pos, 0x00555555, 0x00333333, cell, 0);
(incr.y)++;
pos.x += cell;
}
(incr.x)++;
pos.x = 0;
pos.y += cell;
}
pos.x = game->plr.pos.x - cell / 2;
pos.y = game->plr.pos.y - cell / 2;
draw_square(game, pos, 0x00999900, 0x00330033, cell, 1);
}
/*
static void draw_screen(t_game *game, t_rcast *rcast)
{
t_vec screen;
// draw screen size
screen.start.x = rcast->screen_size.start.x + game->plr.pos.x;
screen.start.y = rcast->screen_size.start.y + game->plr.pos.y;
rotate(&(game->plr), &(screen.start));
screen.end.x = rcast->screen_size.end.x + game->plr.pos.x;
screen.end.y = rcast->screen_size.end.y + game->plr.pos.y;
rotate(&(game->plr), &(screen.end));
draw_line(&game->map_img, &screen, 0x00FFFFFF);
// draw screen dist
screen.start.x = rcast->screen_dist.start.x + game->plr.pos.x;
screen.start.y = rcast->screen_dist.start.y + game->plr.pos.y;
screen.end.x = rcast->screen_dist.end.x + game->plr.pos.x;
screen.end.y = rcast->screen_dist.end.y + game->plr.pos.y;
rotate(&(game->plr), &(screen.end));
draw_line(&game->map_img, &screen, 0x00FFFFFF);
}
*/
// tmp end
void draw(t_game *game) void draw(t_game *game)
{ {
// tmp, to draw map
draw_map(game);
// tmp end
raycast(game, &(game->rcast)); raycast(game, &(game->rcast));
// tmp, to draw map
// draw_screen(game, &(game->rcast));
mlx_put_image_to_window(game->mlx_ptr, game->map_win.ptr, game->map_img.ptr, 0, SCREEN_HEIGHT);
// tmp end
mlx_put_image_to_window(game->mlx_ptr, game->win.ptr, game->img.ptr, 0, 0); mlx_put_image_to_window(game->mlx_ptr, game->win.ptr, game->img.ptr, 0, 0);
} }

77
srcs/draw/draw_column.c Normal file
View File

@@ -0,0 +1,77 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* draw_column.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: pblagoje <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/05/04 13:51:59 by pblagoje #+# #+# */
/* Updated: 2022/05/04 13:52:01 by pblagoje ### ########.fr */
/* */
/* ************************************************************************** */
#include "cube3d.h"
static void draw_floor_ceiling(t_game *game, t_rcast *rcast, t_txt *txt)
{
t_vec plan;
plan.start.x = rcast->ray_nb;
plan.end.x = rcast->ray_nb;
if (rcast->wall.vec.start.y > 0)
{
plan.start.y = rcast->screen_height;
plan.end.y = rcast->wall.vec.start.y;
draw_line(&game->img, &plan, txt->rgb_floor);
}
if (rcast->wall.vec.start.y < rcast->screen_height)
{
plan.start.y = rcast->wall.vec.end.y;
plan.end.y = 0;
draw_line(&game->img, &plan, txt->rgb_ceiling);
}
}
static int get_texture(t_img *img, int imgx, int j, int height)
{
char *color;
int y;
int position;
y = ((long)j * (long)img->height) / height;
position = y * img->szl + imgx * (img->bpp / 8);
color = img->data + position;
return (*(int *)color);
}
static void draw_txt_column(t_game *game, t_wall *wall, t_img *txt_img)
{
int col;
int img_x;
int i;
int j;
img_x = (wall->posx * txt_img->width) / game->rcast.cell;
j = wall->limit;
i = 0;
while (j < wall->height - wall->limit)
{
col = get_texture(txt_img, img_x, j, wall->height);
draw_pixel(&game->img, wall->vec.start.x, wall->vec.end.y + i, col);
j++;
i++;
}
}
void draw_column(t_game *game, t_rcast *rcast, t_wall *wall, t_txt *txt)
{
draw_floor_ceiling(game, rcast, txt);
if (!rcast->is_x && rcast->slope_y > 0)
draw_txt_column(game, wall, &txt->img_n);
else if (!rcast->is_x && rcast->slope_y < 0)
draw_txt_column(game, wall, &txt->img_s);
else if (rcast->is_x && rcast->slope_x > 0)
draw_txt_column(game, wall, &txt->img_e);
else if (rcast->is_x && rcast->slope_x < 0)
draw_txt_column(game, wall, &txt->img_w);
}

Some files were not shown because too many files have changed in this diff Show More