Skip to content

Commit 38c755e

Browse files
committed
Added example project
1 parent d6732e0 commit 38c755e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+2300
-1
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ See file [yamc.gml](utils/yamc.gml) for simple utility functions. The
1616
custom ones. If you are not familiar with shaders, you can also draw the models
1717
using GameMaker's built-in shaders with [lighting](https://manual.yoyogames.com/GameMaker_Language/GML_Reference/Drawing/Lighting/Lighting.htm),
1818
[fog](https://manual.yoyogames.com/GameMaker_Language/GML_Reference/Drawing/GPU_Control/gpu_set_fog.htm)
19-
etc.
19+
etc. See [examples](examples) folder for little example projects.
2020

2121
# Features
2222
* Convert static model into a binary file, easily loadable using functions `buffer_load` and `vertex_create_buffer_from_buffer`.

examples/.gitkeep

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"FolderOrderSettings": [],
3+
"ResourceOrderSettings": [
4+
{"name":"OModelViewer","order":16,"path":"objects/OModelViewer/OModelViewer.yy",},
5+
{"name":"yamc","order":17,"path":"scripts/yamc/yamc.yy",},
6+
{"name":"SprSpecular","order":20,"path":"sprites/SprSpecular/SprSpecular.yy",},
7+
{"name":"ShBasic","order":18,"path":"shaders/ShBasic/ShBasic.yy",},
8+
{"name":"SprNormal","order":19,"path":"sprites/SprNormal/SprNormal.yy",},
9+
{"name":"SprGloss","order":21,"path":"sprites/SprGloss/SprGloss.yy",},
10+
{"name":"SprDiffuse","order":22,"path":"sprites/SprDiffuse/SprDiffuse.yy",},
11+
{"name":"Room1","order":15,"path":"rooms/Room1/Room1.yy",},
12+
],
13+
}

examples/ModelViewer/ModelViewer.yyp

+46
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Binary file not shown.
Binary file not shown.
Loading
Loading
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
https://polyhaven.com/a/cardboard_box_01
Binary file not shown.

examples/ModelViewer/datafiles/firetruck/firetruck.fbx

+882
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
https://kenney.nl/assets/car-kit
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
camera_destroy(camera);
2+
FreeModelAndSprites();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
display_set_gui_maximize(1, 1);
2+
3+
// The camera used when rendering the 3D model
4+
camera = camera_create();
5+
6+
// This object's (camera's) position on z axis
7+
z = 0;
8+
9+
// Camera's horizontal direction
10+
direction = -45;
11+
12+
// Camera's vertical direction
13+
directionUp = 25;
14+
15+
// Camera's distance from 0, 0, 0
16+
zoom = 1;
17+
18+
// Mouse X position from previous frame
19+
mouseLastX = 0;
20+
21+
// Mouse Y position from previous frame
22+
mouseLastY = 0;
23+
24+
// The loaded vertex buffer or undefined
25+
model = undefined;
26+
27+
// The model's diffuse texture
28+
spriteDiffuse = undefined;
29+
30+
// The model's normal map texture
31+
spriteNormal = undefined;
32+
33+
// The model's specular color texture
34+
spriteSpecular = undefined;
35+
36+
// The model's glossiness texture (0 = rough, 255 = smooth)
37+
spriteGloss = undefined;
38+
39+
// Use true to enable texture filtering
40+
textureFilter = true;
41+
42+
// Cache the identity matrix just so we dont make a new one every frame
43+
matrixIdentity = matrix_build_identity();
44+
45+
// The model's transformation matrix
46+
matrix = matrixIdentity;
47+
48+
// Open file dialog path
49+
openPath = working_directory;
50+
51+
// Frees memory after loaded models and sprites
52+
FreeModelAndSprites = function ()
53+
{
54+
if (model != undefined)
55+
{
56+
vertex_delete_buffer(model);
57+
model = undefined;
58+
}
59+
60+
if (spriteDiffuse != undefined)
61+
{
62+
sprite_delete(spriteDiffuse);
63+
spriteDiffuse = undefined;
64+
}
65+
66+
if (spriteNormal != undefined)
67+
{
68+
sprite_delete(spriteNormal);
69+
spriteNormal = undefined;
70+
}
71+
72+
if (spriteSpecular != undefined)
73+
{
74+
sprite_delete(spriteSpecular);
75+
spriteSpecular = undefined;
76+
}
77+
78+
if (spriteGloss != undefined)
79+
{
80+
sprite_delete(spriteGloss);
81+
spriteGloss = undefined;
82+
}
83+
};
84+
85+
// Frees current model and sprites from memory and loads a new model
86+
LoadModel = function (_path)
87+
{
88+
FreeModelAndSprites();
89+
var _buffer = buffer_load(_path);
90+
model = vertex_create_buffer_from_buffer(_buffer, vertex_format_pnuct);
91+
92+
// Compute model's bounding box
93+
var _xmin = undefined;
94+
var _xmax = undefined;
95+
var _ymin = undefined;
96+
var _ymax = undefined;
97+
var _zmin = undefined;
98+
var _zmax = undefined;
99+
var _position = 0;
100+
var _stride = (3 * 4) + (3 * 4) + (2 * 4) + 4 + (4 * 4); // pnuct
101+
102+
repeat (vertex_get_number(model))
103+
{
104+
var _x = buffer_peek(_buffer, _position + 0, buffer_f32);
105+
var _y = buffer_peek(_buffer, _position + 4, buffer_f32);
106+
var _z = buffer_peek(_buffer, _position + 8, buffer_f32);
107+
108+
_xmin = min(_xmin ?? _x, _x);
109+
_xmax = max(_xmax ?? _x, _x);
110+
_ymin = min(_ymin ?? _y, _y);
111+
_ymax = max(_ymax ?? _y, _y);
112+
_zmin = min(_zmin ?? _z, _z);
113+
_zmax = max(_zmax ?? _z, _z);
114+
115+
_position += _stride;
116+
}
117+
118+
// Scale down the model and center it around 0, 0, 0
119+
var _scale = 1 / max(_xmax - _xmin, _ymax - _ymin, _zmax - _zmin);
120+
121+
matrix = matrix_build(
122+
-((_xmin + _xmax) / 2) * _scale,
123+
-((_ymin + _ymax) / 2) * _scale,
124+
-((_zmin + _zmax) / 2) * _scale,
125+
0, 0, 0,
126+
_scale, _scale, _scale);
127+
128+
vertex_freeze(model);
129+
buffer_delete(_buffer);
130+
};
131+
132+
LoadDiffuse = function (_path)
133+
{
134+
if (spriteDiffuse != undefined)
135+
{
136+
sprite_delete(spriteDiffuse)
137+
}
138+
spriteDiffuse = sprite_add(_path, 1, false, true, 0, 0);
139+
};
140+
141+
LoadNormal = function (_path)
142+
{
143+
if (spriteNormal != undefined)
144+
{
145+
sprite_delete(spriteNormal);
146+
}
147+
spriteNormal = sprite_add(_path, 1, false, true, 0, 0);
148+
};
149+
150+
LoadSpecular = function (_path)
151+
{
152+
if (spriteSpecular != undefined)
153+
{
154+
sprite_delete(spriteSpecular);
155+
}
156+
spriteSpecular = sprite_add(_path, 1, false, true, 0, 0);
157+
};
158+
159+
LoadGloss = function (_path)
160+
{
161+
if (spriteGloss != undefined)
162+
{
163+
sprite_delete(spriteGloss);
164+
}
165+
spriteGloss = sprite_add(_path, 1, false, true, 0, 0);
166+
};
167+
168+
LoadModel("firetruck/firetruck.bin");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
draw_clear(#202020);
2+
3+
// We don't need to do anything if there's no model loaded
4+
if (model == undefined)
5+
{
6+
exit;
7+
}
8+
9+
// Apply our 3D camera
10+
camera_apply(camera);
11+
12+
// Change GPU settings to enable 3D
13+
gpu_push_state();
14+
gpu_set_zwriteenable(true);
15+
gpu_set_ztestenable(true);
16+
gpu_set_tex_mip_enable(mip_on);
17+
gpu_set_tex_filter(textureFilter);
18+
19+
// Use the basic shader
20+
shader_set(ShBasic);
21+
shader_set_uniform_f(shader_get_uniform(ShBasic, "u_vCamera"), x, y, z);
22+
texture_set_stage(shader_get_sampler_index(ShBasic, "u_texNormal"),
23+
sprite_get_texture(spriteNormal ?? SprNormal, 0));
24+
texture_set_stage(shader_get_sampler_index(ShBasic, "u_texSpecular"),
25+
sprite_get_texture(spriteSpecular ?? SprSpecular, 0));
26+
texture_set_stage(shader_get_sampler_index(ShBasic, "u_texGloss"),
27+
sprite_get_texture(spriteGloss ?? SprGloss, 0));
28+
29+
// Draw the model with its transform matrix applied
30+
matrix_set(matrix_world, matrix);
31+
vertex_submit(model, pr_trianglelist, sprite_get_texture(spriteDiffuse ?? SprDiffuse, 0));
32+
matrix_set(matrix_world, matrixIdentity);
33+
34+
// Unset shader
35+
shader_reset();
36+
37+
// Restore previous GPU settings
38+
gpu_pop_state();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
draw_text(8, 8,
2+
"Ctrl+L - Load model (pnuct format)\n"
3+
+ "Ctrl+D - Load diffuse texture\n"
4+
+ "Ctrl+N - Load normal texture\n"
5+
+ "Ctrl+S - Load specular color texture\n"
6+
+ "Ctrl+G - Load glossiness texture\n"
7+
+ "Ctrl+F - Toggle texture filtering\n"
8+
);

examples/ModelViewer/objects/OModelViewer/OModelViewer.yy

+37
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)