- [3D Camera] Fix render result error when previewing.

This commit is contained in:
Tanasart 2023-09-05 18:05:18 +02:00
parent 47615ff56a
commit 1907b33d80
18 changed files with 564 additions and 62 deletions

View file

@ -5,6 +5,7 @@
{"name":"_extensions","order":16,"path":"folders/_extensions.yy",},
{"name":"BBMOD","order":8,"path":"folders/_extensions/BBMOD.yy",},
{"name":"Math","order":1,"path":"folders/_extensions/BBMOD/Math.yy",},
{"name":"GMD3D11","order":11,"path":"folders/_extensions/GMD3D11.yy",},
{"name":"MAC","order":6,"path":"folders/_extensions/MAC.yy",},
{"name":"addons","order":10,"path":"folders/addons.yy",},
{"name":"custom","order":4,"path":"folders/addons/custom.yy",},
@ -1315,6 +1316,7 @@
{"name":"vectorBox","order":18,"path":"scripts/vectorBox/vectorBox.yy",},
{"name":"sh_3d_extrude_corner","order":7,"path":"shaders/sh_3d_extrude_corner/sh_3d_extrude_corner.yy",},
{"name":"sh_blend_normal_dim","order":10,"path":"shaders/sh_blend_normal_dim/sh_blend_normal_dim.yy",},
{"name":"__d3d11_cbuffer","order":1,"path":"scripts/__d3d11_cbuffer/__d3d11_cbuffer.yy",},
{"name":"node_skew","order":11,"path":"scripts/node_skew/node_skew.yy",},
{"name":"s_node_dot_product","order":13,"path":"sprites/s_node_dot_product/s_node_dot_product.yy",},
{"name":"sh_downsample","order":1,"path":"shaders/sh_downsample/sh_downsample.yy",},
@ -1353,6 +1355,7 @@
{"name":"node_grey_to_alpha","order":4,"path":"scripts/node_grey_to_alpha/node_grey_to_alpha.yy",},
{"name":"sh_blend_add","order":7,"path":"shaders/sh_blend_add/sh_blend_add.yy",},
{"name":"s_node_FFT","order":15,"path":"sprites/s_node_FFT/s_node_FFT.yy",},
{"name":"__d3d11_shader","order":2,"path":"scripts/__d3d11_shader/__d3d11_shader.yy",},
{"name":"node_de_stray","order":1,"path":"scripts/node_de_stray/node_de_stray.yy",},
{"name":"d3d_transformation","order":12,"path":"scripts/d3d_transformation/d3d_transformation.yy",},
{"name":"sh_channel_G","order":2,"path":"shaders/sh_channel_G/sh_channel_G.yy",},

View file

@ -25,6 +25,7 @@
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"BBMOD","folderPath":"folders/_extensions/BBMOD.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"Math","folderPath":"folders/_extensions/BBMOD/Math.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"Gameframe","folderPath":"folders/_extensions/Gameframe.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"GMD3D11","folderPath":"folders/_extensions/GMD3D11.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"MAC","folderPath":"folders/_extensions/MAC.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"addons","folderPath":"folders/addons.yy",},
{"resourceType":"GMFolder","resourceVersion":"1.0","name":"custom","folderPath":"folders/addons/custom.yy",},
@ -667,6 +668,7 @@
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"gifski.dll","CopyToMask":-1,"filePath":"datafiles/gifski/win/developer",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"gifski.h","CopyToMask":-1,"filePath":"datafiles/gifski/win/developer",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"gifski.exe","CopyToMask":-1,"filePath":"datafiles/gifski/win",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"GMD3D11.dll","CopyToMask":-1,"filePath":"datafiles",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"convert.exe","CopyToMask":-1,"filePath":"datafiles/ImageMagick",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"LICENSE.txt","CopyToMask":-1,"filePath":"datafiles/ImageMagick",},
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"magick.exe","CopyToMask":-1,"filePath":"datafiles/ImageMagick",},
@ -1992,6 +1994,7 @@
{"id":{"name":"vectorBox","path":"scripts/vectorBox/vectorBox.yy",},},
{"id":{"name":"sh_3d_extrude_corner","path":"shaders/sh_3d_extrude_corner/sh_3d_extrude_corner.yy",},},
{"id":{"name":"sh_blend_normal_dim","path":"shaders/sh_blend_normal_dim/sh_blend_normal_dim.yy",},},
{"id":{"name":"__d3d11_cbuffer","path":"scripts/__d3d11_cbuffer/__d3d11_cbuffer.yy",},},
{"id":{"name":"node_skew","path":"scripts/node_skew/node_skew.yy",},},
{"id":{"name":"s_node_dot_product","path":"sprites/s_node_dot_product/s_node_dot_product.yy",},},
{"id":{"name":"s_node_canvas","path":"sprites/s_node_canvas/s_node_canvas.yy",},},
@ -2037,6 +2040,7 @@
{"id":{"name":"node_grey_to_alpha","path":"scripts/node_grey_to_alpha/node_grey_to_alpha.yy",},},
{"id":{"name":"sh_blend_add","path":"shaders/sh_blend_add/sh_blend_add.yy",},},
{"id":{"name":"s_node_FFT","path":"sprites/s_node_FFT/s_node_FFT.yy",},},
{"id":{"name":"__d3d11_shader","path":"scripts/__d3d11_shader/__d3d11_shader.yy",},},
{"id":{"name":"node_de_stray","path":"scripts/node_de_stray/node_de_stray.yy",},},
{"id":{"name":"d3d_transformation","path":"scripts/d3d_transformation/d3d_transformation.yy",},},
{"id":{"name":"sh_channel_G","path":"shaders/sh_channel_G/sh_channel_G.yy",},},
@ -2092,6 +2096,7 @@
{"id":{"name":"node_action_object","path":"scripts/node_action_object/node_action_object.yy",},},
{"id":{"name":"s_node_pb_box_divide","path":"sprites/s_node_pb_box_divide/s_node_pb_box_divide.yy",},},
{"id":{"name":"bin_function","path":"scripts/bin_function/bin_function.yy",},},
{"id":{"name":"__d3d11","path":"scripts/__d3d11/__d3d11.yy",},},
{"id":{"name":"s_node_feedback_output","path":"sprites/s_node_feedback_output/s_node_feedback_output.yy",},},
{"id":{"name":"sh_fd_repulse","path":"shaders/sh_fd_repulse/sh_fd_repulse.yy",},},
{"id":{"name":"sh_surface_replace_fast_find","path":"shaders/sh_surface_replace_fast_find/sh_surface_replace_fast_find.yy",},},

BIN
datafiles/GMD3D11.dll Normal file

Binary file not shown.

124
scripts/__d3d11/__d3d11.gml Normal file
View file

@ -0,0 +1,124 @@
/// @macro {String} Path to the GMD3D11 dynamic library.
/// Default value is "GMD3D11.dll".
#macro GMD3D11_PATH "GMD3D11.dll"
/// @macro {Bool} Expands to `true` if GMD3D11 is supported on the current
/// platform.
#macro GMD3D11_IS_SUPPORTED (os_type == os_windows)
/// @func d3d11_get_error_string()
///
/// @desc Retrieves the last error message.
///
/// @return {String} The last error message.
function d3d11_get_error_string()
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_get_error_string", dll_cdecl, ty_string,
0);
return external_call(_fn);
}
/// @func d3d11_texture_set_stage_vs(_slot, _texture)
///
/// @desc Passes a texture to a vertex shader.
///
/// @param {Real} _slot The vertex texture slot index. Must be in range
/// 0..{@link D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT}-1.
/// @param {Pointer.Texture} _texture The texture to pass.
///
/// @return {Real} Returns 1 on success or 0 on fail.
function d3d11_texture_set_stage_vs(_slot, _texture)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_texture_set_stage_vs", dll_cdecl, ty_real,
1, ty_real);
texture_set_stage(0, _texture);
return external_call(_fn, _slot);
}
/// @func texture_set_stage_vs(_slot, _texture)
///
/// @desc If GMD3D11 is supported, then uses {@link d3d11_texture_set_stage_vs}
/// to pass a texture to a vertex shader, otherwise uses `texture_set_stage`
/// (which should work on OpenGL platforms).
///
/// @param {Real} _slot The vertex texture slot index. Must be in range 0..7.
/// @param {Pointer.Texture} _texture The texture to pass.
///
/// @see GMD3D11_IS_SUPPORTED
function texture_set_stage_vs(_slot, _texture)
{
gml_pragma("forceinline");
if (GMD3D11_IS_SUPPORTED)
{
d3d11_texture_set_stage_vs(_slot, _texture);
return;
}
texture_set_stage(_slot, _texture);
}
/// @func d3d11_texture_set_stage_ps(_slot, _texture)
///
/// @desc Passes a texture to a pixel shader.
///
/// @param {Real} _slot The pixel texture slot index. Must be in range
/// 0..{@link D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT}-1.
/// @param {Pointer.Texture} _texture The texture to pass.
///
/// @return {Real} Returns 1 on success or 0 on fail.
function d3d11_texture_set_stage_ps(_slot, _texture)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_texture_set_stage_ps", dll_cdecl, ty_real,
1, ty_real);
texture_set_stage(0, _texture);
return external_call(_fn, _slot);
}
/// @func d3d11_draw_instanced(_count)
///
/// @desc Configures the number of instances to draw the next time a vertex buffer
/// is submitted. After that the number is reset back to 0!
///
/// @param {Real} _count Number of instances to draw. Use 0 to disable instanced rendering.
function d3d11_draw_instanced(_count)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_draw_instanced", dll_cdecl, ty_real,
1, ty_real);
return external_call(_fn, _count);
}
/// @func vertex_submit_instanced(_vbuff, _prim, _texture, _count)
///
/// @desc Draws multiple instances of a vertex buffer.
///
/// @param {Id.VertexBuffer} _vbuff The vertex buffer to submit.
/// @param {Constant.PrimitiveType} _prim The primitive type.
/// @param {Pointer.Texture} _texture The texture to use.
/// @param {Real} _count The number of instances to draw.
function vertex_submit_instanced(_vbuff, _prim, _texture, _count)
{
gml_pragma("forceinline");
if (!d3d11_draw_instanced(_count))
{
return false;
}
vertex_submit(_vbuff, _prim, _texture);
return true;
}
if (GMD3D11_IS_SUPPORTED)
{
var _init = external_define(
GMD3D11_PATH, "d3d11_init", dll_cdecl, ty_real, 2, ty_string, ty_string);
var _osInfo = os_get_info();
var _device = _osInfo[? "video_d3d11_device"];
var _context = _osInfo[? "video_d3d11_context"];
external_call(_init, _device, _context);
}

View file

@ -0,0 +1,11 @@
{
"resourceType": "GMScript",
"resourceVersion": "1.0",
"name": "__d3d11",
"isCompatibility": false,
"isDnD": false,
"parent": {
"name": "GMD3D11",
"path": "folders/_extensions/GMD3D11.yy",
},
}

View file

@ -0,0 +1,183 @@
/// @func d3d11_cbuffer_begin()
///
/// @desc Starts building a constant buffer.
///
/// @see d3d11_cbuffer_end
function d3d11_cbuffer_begin()
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_cbuffer_begin", dll_cdecl, ty_real,
0);
return external_call(_fn);
}
/// @func d3d11_cbuffer_end()
///
/// @desc Finishes building a constant buffer.
///
/// @return {Real} The ID of the created constant buffer or -1 on fail.
///
/// @see d3d11_cbuffer_exists
/// @see d3d11_cbuffer_update
function d3d11_cbuffer_end()
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_cbuffer_end", dll_cdecl, ty_real,
0);
return external_call(_fn);
}
/// @func d3d11_cbuffer_add_bool(_count)
///
/// @desc Adds a bool into a constant buffer that is currently being built.
///
/// @param {Real} _count Number of bools to add into the constant buffer.
///
/// @see d3d11_cbuffer_begin
function d3d11_cbuffer_add_bool(_count)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_cbuffer_add_bool", dll_cdecl, ty_real,
1, ty_real);
return external_call(_fn, _count);
}
/// @func d3d11_cbuffer_add_int(_count)
///
/// @desc Adds an int into a constant buffer that is currently being built.
///
/// @param {Real} _count Number of ints to add into the constant buffer.
///
/// @see d3d11_cbuffer_begin
function d3d11_cbuffer_add_int(_count)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_cbuffer_add_int", dll_cdecl, ty_real,
1, ty_real);
return external_call(_fn, _count);
}
/// @func d3d11_cbuffer_add_uint(_count)
///
/// @desc Adds an uint into a constant buffer that is currently being built.
///
/// @param {Real} _count Number of uints to add into the constant buffer.
///
/// @see d3d11_cbuffer_begin
function d3d11_cbuffer_add_uint(_count)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_cbuffer_add_uint", dll_cdecl, ty_real,
1, ty_real);
return external_call(_fn, _count);
}
/// @func d3d11_cbuffer_add_float(_count)
///
/// @desc Adds a float into a constant buffer that is currently being built.
///
/// @param {Real} _count Number of floats to add into the constant buffer.
///
/// @see d3d11_cbuffer_begin
function d3d11_cbuffer_add_float(_count)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_cbuffer_add_float", dll_cdecl, ty_real,
1, ty_real);
return external_call(_fn, _count);
}
/// @func d3d11_cbuffer_get_size(_cbuffer)
///
/// @desc Retrieves size of a constant buffer in bytes.
///
/// @param {Real} The size of the constant buffer in bytes.
function d3d11_cbuffer_get_size(_cbuffer)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_cbuffer_get_size", dll_cdecl, ty_real,
1, ty_real);
return external_call(_fn, _cbuffer);
}
/// @func d3d11_cbuffer_update(_cbuffer, _buffer)
///
/// @desc Updates data of a constant buffer.
///
/// @param {Real} _cbuffer The ID of the constant buffer.
/// @param {Id.Buffer} _buffer A buffer with new data.
function d3d11_cbuffer_update(_cbuffer, _buffer)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_cbuffer_update", dll_cdecl, ty_real,
2, ty_real, ty_string);
return external_call(_fn, _cbuffer, buffer_get_address(_buffer));
}
/// @func d3d11_shader_set_cbuffer_ps(_slot, _cbuffer)
///
/// @desc Binds a constant buffer to a pixel shader.
///
/// @param {Real} _slot The slot to bind the constant buffer to.
/// @param {Real} _cbuffer The ID of the constant buffer or -1 to ubind the slot.
function d3d11_shader_set_cbuffer_ps(_slot, _cbuffer)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_shader_set_cbuffer_ps", dll_cdecl, ty_real,
2, ty_real, ty_real);
return external_call(_fn, _slot, _cbuffer);
}
/// @func d3d11_shader_set_cbuffer_vs(_slot, _cbuffer)
///
/// @desc Binds a constant buffer to a vertex shader.
///
/// @param {Real} _slot The slot to bind the constant buffer to.
/// @param {Real} _cbuffer The ID of the constant buffer or -1 to ubind the slot.
function d3d11_shader_set_cbuffer_vs(_slot, _cbuffer)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_shader_set_cbuffer_vs", dll_cdecl, ty_real,
2, ty_real, ty_real);
return external_call(_fn, _slot, _cbuffer);
}
/// @func d3d11_cbuffer_exists(_cbuffer)
///
/// @desc Checks whether a constant buffer exists.
///
/// @param {Real} _cbuffer The ID of the comand buffer.
///
/// @return {Bool} Returns true if the constant buffer exists.
function d3d11_cbuffer_exists(_cbuffer)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_cbuffer_exists", dll_cdecl, ty_real,
1, ty_real);
return external_call(_fn, _cbuffer);
}
/// @func d3d11_cbuffer_destroy(_cbuffer)
///
/// @desc Destroys a constant buffer.
///
/// @param {Real} _cbuffer The ID of the constant buffer to destroy.
function d3d11_cbuffer_destroy(_cbuffer)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_cbuffer_destroy", dll_cdecl, ty_real,
1, ty_real);
return external_call(_fn, _cbuffer);
}

View file

@ -0,0 +1,11 @@
{
"resourceType": "GMScript",
"resourceVersion": "1.0",
"name": "__d3d11_cbuffer",
"isCompatibility": false,
"isDnD": false,
"parent": {
"name": "GMD3D11",
"path": "folders/_extensions/GMD3D11.yy",
},
}

View file

@ -0,0 +1,104 @@
/// @macro {Real} Maximum number of slots for shader resources.
#macro D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT 128
/// @func d3d11_shader_compile_ps(_file, _entryPoint, _profile)
///
/// @desc Compiles a pixel shader from file.
///
/// @param {String} _file The path to file to compile.
/// @param {String} _entryPoint The name of the entry point function, e.g. "main".
/// @param {String} _profile The pixel shader profile, e.g. "ps_4_0".
///
/// @return {Real} The ID of the pixel shader or -1 on fail.
///
/// @see d3d11_get_error_string
function d3d11_shader_compile_ps(_file, _entryPoint, _profile)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_shader_compile_ps", dll_cdecl, ty_real,
3, ty_string, ty_string, ty_string);
return external_call(_fn, _file, _entryPoint, _profile);
}
/// @func d3d11_shader_compile_vs(_file, _entryPoint, _profile)
///
/// @desc Compiles a vertex shader from file.
///
/// @param {String} _file The path to file to compile.
/// @param {String} _entryPoint The name of the entry point function, e.g. "main".
/// @param {String} _profile The vertex shader profile, e.g. "vs_4_0".
///
/// @return {Real} The ID of the vertex shader or -1 on fail.
///
/// @see d3d11_get_error_string
function d3d11_shader_compile_vs(_file, _entryPoint, _profile)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_shader_compile_vs", dll_cdecl, ty_real,
3, ty_string, ty_string, ty_string);
return external_call(_fn, _file, _entryPoint, _profile);
}
/// @func d3d11_shader_override_ps(_ps)
///
/// @desc Hooks into `ID3D11DeviceContext::Draw` and replaces the current pixel
/// shader with a custom one.
///
/// @param {Real} _ps The ID of the shader or -1 to disable the override.
function d3d11_shader_override_ps(_ps)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_shader_override_ps", dll_cdecl, ty_real,
1, ty_real);
return external_call(_fn, _ps);
}
/// @func d3d11_shader_override_vs(_vs)
///
/// @desc Hooks into `ID3D11DeviceContext::Draw` and replaces the current vertex
/// shader with a custom one.
///
/// @param {Real} _vs The ID of the shader or -1 to disable the override. The
/// vertex format expected by the shader must be compatible with the overriden
/// shader!
function d3d11_shader_override_vs(_vs)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_shader_override_vs", dll_cdecl, ty_real,
1, ty_real);
return external_call(_fn, _vs);
}
/// @func d3d11_shader_exists(_shader)
///
/// @desc Checks whether a shader exists.
///
/// @param {Real} _ps The ID of the shader.
///
/// @return {Bool} Returns true if the shader exists.
function d3d11_shader_exists(_shader)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_shader_exists", dll_cdecl, ty_real,
1, ty_real);
return external_call(_fn, _shader);
}
/// @func d3d11_shader_destroy(_shader)
///
/// @desc Destroys a shader.
///
/// @param {Real} _shader The ID of the shader to destroy.
function d3d11_shader_destroy(_shader)
{
gml_pragma("forceinline");
static _fn = external_define(
GMD3D11_PATH, "d3d11_shader_destroy", dll_cdecl, ty_real,
1, ty_real);
return external_call(_fn, _shader);
}

View file

@ -0,0 +1,11 @@
{
"resourceType": "GMScript",
"resourceVersion": "1.0",
"name": "__d3d11_shader",
"isCompatibility": false,
"isDnD": false,
"parent": {
"name": "GMD3D11",
"path": "folders/_extensions/GMD3D11.yy",
},
}

View file

@ -46,7 +46,7 @@ function Node_3D(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constr
gpu_set_ztestenable(true);
gpu_set_cullmode(cull_noculling);
D3D_GLOBAL_PREVIEW.applyCamera();
D3D_GLOBAL_PREVIEW.camera.applyCamera();
D3D_GLOBAL_PREVIEW.apply();
for( var i = 0, n = array_length(_prev_obj); i < n; i++ ) {
@ -66,7 +66,7 @@ function Node_3D(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constr
}
surface_reset_target();
D3D_GLOBAL_PREVIEW.resetCamera();
D3D_GLOBAL_PREVIEW.camera.resetCamera();
} #endregion
static postUpdate = function() { refreshPreview(); }

View file

@ -23,6 +23,23 @@ function Panel_Linear_Setting() : PanelContent() constructor {
var _prop = properties[i];
var _widg = _prop[0];
if(is_string(_widg)) {
var _text = _prop[0];
var _spr = _prop[1];
var _ind = _prop[2];
var _colr = _prop[3];
draw_sprite_stretched_ext(THEME.group_label, 0, ui(4), yy - th / 2 + ui(2), w - ui(8), th - ui(4), _colr, 1);
draw_sprite_ui(_spr, _ind, ui(4) + th / 2, yy);
draw_set_text(f_p1, fa_left, fa_center, COLORS._main_text);
draw_text_add(ui(4) + th, yy, _text);
yy += th;
continue;
}
var _text = _prop[1];
var _data = _prop[2]();

View file

@ -37,9 +37,9 @@ function __3dScene(camera) constructor {
lightAmbient = c_black;
lightDir_max = 16;
lightDir_shadow_max = 2;
lightDir_shadow_max = 4;
lightPnt_max = 16;
lightPnt_shadow_max = 2;
lightPnt_shadow_max = 4;
cull_mode = cull_noculling;
enviroment_map = noone;
@ -52,10 +52,7 @@ function __3dScene(camera) constructor {
show_normal = false;
geometry_data = [ noone, noone, noone ];
ssao_enabled = false;
ssao = noone;
ssao_sample = 32;
ssao_radius = 0.1;
ssao_bias = 0.1;
@ -88,9 +85,6 @@ function __3dScene(camera) constructor {
lightPnt_shadowBias = [];
} reset(); #endregion
static applyCamera = function() { camera.applyCamera(); }
static resetCamera = function() { camera.resetCamera(); }
static _submit = function(callback, object, shader = noone) {
matrix_stack_clear();
if(apply_transform) custom_transform.submitMatrix();
@ -104,8 +98,10 @@ function __3dScene(camera) constructor {
static submitShader = function(object, shader = noone) { _submit(function(object, shader) { object.submitShader (self, shader); }, object, shader) }
static deferPass = function(object, w, h) { #region
geometryPass(object, w, h);
ssaoPass();
var geometry_data = geometryPass(object, w, h);
var ssao = ssaoPass(geometry_data);
return { geometry_data, ssao };
} #endregion
static renderBackground = function(w, h) { #region
@ -132,6 +128,7 @@ function __3dScene(camera) constructor {
} #endregion
static geometryPass = function(object, w = 512, h = 512) { #region
var geometry_data = [ noone, noone, noone ];
geometry_data[0] = surface_verify(geometry_data[0], w, h, surface_rgba32float);
geometry_data[1] = surface_verify(geometry_data[1], w, h, surface_rgba32float);
geometry_data[2] = surface_verify(geometry_data[2], w, h, surface_rgba32float);
@ -144,7 +141,7 @@ function __3dScene(camera) constructor {
DRAW_CLEAR
camera.setMatrix();
applyCamera();
camera.applyCamera();
gpu_set_cullmode(cull_mode);
@ -169,10 +166,11 @@ function __3dScene(camera) constructor {
surface_free(geometry_data[2]);
geometry_data[2] = _normal_blurred;
}
return geometry_data;
} #endregion
static ssaoPass = function() { #region
surface_free_safe(ssao);
static ssaoPass = function(geometry_data) { #region
if(!ssao_enabled) return;
var _sw = surface_get_width(geometry_data[0]);
@ -201,17 +199,17 @@ function __3dScene(camera) constructor {
surface_free(_ssao_surf);
ssao = _ssao_blur;
return _ssao_blur;
} #endregion
static apply = function() { #region
static apply = function(deferData = noone) { #region
shader_set(sh_d3d_default);
#region ---- background ----
shader_set_f("light_ambient", colToVec4(lightAmbient));
shader_set_i("env_use_mapping", is_surface(enviroment_map) );
shader_set_surface("env_map", enviroment_map, false, true );
shader_set_dim("env_map_dimension", enviroment_map );
shader_set_surface("ao_map", ssao );
if(deferData != noone) shader_set_surface("ao_map", deferData.ssao );
#endregion
shader_set_i("light_dir_count", lightDir_count); #region
@ -220,7 +218,7 @@ function __3dScene(camera) constructor {
shader_set_f("light_dir_color", lightDir_color);
shader_set_f("light_dir_intensity", lightDir_intensity);
shader_set_i("light_dir_shadow_active", lightDir_shadow);
for( var i = 0, n = array_length(lightDir_shadowMap); i < n; i++ )
for( var i = 0, n = array_length(lightDir_shadowMap); i < n; i++ )
shader_set_surface($"light_dir_shadowmap_{i}", lightDir_shadowMap[i], true);
shader_set_f("light_dir_view", lightDir_viewMat);
shader_set_f("light_dir_proj", lightDir_projMat);
@ -234,16 +232,16 @@ function __3dScene(camera) constructor {
shader_set_f("light_pnt_intensity", lightPnt_intensity);
shader_set_f("light_pnt_radius", lightPnt_radius);
shader_set_i("light_pnt_shadow_active", lightPnt_shadow);
for( var i = 0, n = array_length(lightPnt_shadowMap); i < n; i++ )
for( var i = 0, n = array_length(lightPnt_shadowMap); i < n; i++ )
shader_set_surface($"light_pnt_shadowmap_{i}", lightPnt_shadowMap[i], true, true);
shader_set_f("light_pnt_view", lightPnt_viewMat);
shader_set_f("light_pnt_proj", lightPnt_projMat);
shader_set_f("light_pnt_shadow_bias", lightPnt_shadowBias);
} #endregion
if(defer_normal && array_length(geometry_data) > 2) {
if(defer_normal && deferData != noone && array_length(deferData.geometry_data) > 2) {
shader_set_i("mat_defer_normal", 1);
shader_set_surface("mat_normal_map", geometry_data[2]);
shader_set_surface("mat_normal_map", deferData.geometry_data[2]);
} else
shader_set_i("mat_defer_normal", 0);
@ -255,6 +253,8 @@ function __3dScene(camera) constructor {
shader_set_f("viewProjMat", camera.getCombinedMatrix() );
#endregion
//print($"Submitting scene with {lightDir_count} dir, {lightPnt_count} pnt lights.");
shader_reset();
} #endregion

View file

@ -101,10 +101,10 @@
globalvar VERSION, SAVE_VERSION, VERSION_STRING, BUILD_NUMBER;
VERSION = 11510;
VERSION = 11520;
SAVE_VERSION = 11500;
VERSION_STRING = "1.15.1.0";
BUILD_NUMBER = 11510;
VERSION_STRING = "1.15.2.0";
BUILD_NUMBER = 11520;
globalvar APPEND_MAP;
APPEND_MAP = ds_map_create();

View file

@ -126,9 +126,9 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group)
}
} #endregion
static onValueUpdate = function(index) {
static onValueUpdate = function(index) { #region
if(index == in_d3d + 9) PANEL_PREVIEW.tool_current = noone;
}
} #endregion
static step = function() { #region
var _proj = inputs[| in_d3d + 3].getValue();
@ -261,11 +261,10 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group)
scene.ssao_bias = _aoBi;
scene.ssao_strength = _aoSr;
scene.defer_normal_radius = _nrmSmt;
scene.draw_background = _dbg;
var _bgSurf = _dbg? scene.renderBackground(_dim[0], _dim[1]) : noone;
scene.deferPass(_scne, _dim[0], _dim[1]);
var _defer = scene.deferPass(_scne, _dim[0], _dim[1]);
var _render = outputs[| 0].getValue();
var _normal = outputs[| 1].getValue();
@ -289,7 +288,7 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group)
scene.reset();
scene.submitShader(_scne);
scene.apply();
scene.apply(_defer);
scene.submit(_scne);
surface_reset_target();
@ -308,7 +307,7 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group)
draw_surface(_render, 0, 0);
BLEND_MULTIPLY
draw_surface_safe(scene.ssao);
draw_surface_safe(_defer.ssao);
BLEND_NORMAL
surface_reset_target();
surface_free(_render);

View file

@ -756,6 +756,8 @@ function Panel_Preview() : PanelContent() constructor {
function draw3D() { #region
var _prev_node = getNodePreview();
if(_prev_node == noone) return;
if(!_prev_node.is_3D) return;
_prev_node.previewing = 1;
d3_scene_preview = struct_has(_prev_node, "scene")? _prev_node.scene : d3_scene;
@ -802,12 +804,12 @@ function Panel_Preview() : PanelContent() constructor {
#region background
surface_free_safe(d3_surface_bg);
if(_prev_node.is_3D && d3_scene_preview != d3_scene)
if(d3_scene_preview != d3_scene)
d3_surface_bg = d3_scene_preview.renderBackground(w, h);
#endregion
#region shadow
if(_prev_node.is_3D && d3_scene_preview == d3_scene) {
if(d3_scene_preview == d3_scene) {
d3_scene_light0.shadow_map_scale = d3_view_camera.focus_dist * 2;
var _prev_obj = _prev_node.getPreviewObjects();
@ -834,10 +836,8 @@ function Panel_Preview() : PanelContent() constructor {
d3_surface_outline = surface_verify(d3_surface_outline, w, h);
#region defer
if(_prev_node.is_3D) {
var _prev_obj = _prev_node.getPreviewObject();
d3_scene_preview.deferPass(_prev_obj, w, h);
}
var _prev_obj = _prev_node.getPreviewObject();
var _defer = d3_scene_preview.deferPass(_prev_obj, w, h);
#endregion
#region grid
@ -868,33 +868,31 @@ function Panel_Preview() : PanelContent() constructor {
#endregion
#region draw
if(d3_scene_preview == d3_scene)
d3_scene_preview.reset();
d3_scene_preview.reset();
gpu_set_cullmode(cull_counterclockwise);
if(_prev_node.is_3D) {
var _prev_obj = _prev_node.getPreviewObjects();
var _prev_obj = _prev_node.getPreviewObjects();
if(d3_scene_light_enabled && d3_scene_preview == d3_scene) {
d3_scene.addLightDirectional(d3_scene_light0);
d3_scene.addLightDirectional(d3_scene_light1);
if(d3_scene_preview == d3_scene) {
if(d3_scene_light_enabled) {
d3_scene_preview.addLightDirectional(d3_scene_light0);
d3_scene_preview.addLightDirectional(d3_scene_light1);
}
}
if(d3_scene_preview == d3_scene)
for( var i = 0, n = array_length(_prev_obj); i < n; i++ ) {
var _prev = _prev_obj[i];
if(_prev == noone) continue;
for( var i = 0, n = array_length(_prev_obj); i < n; i++ ) {
var _prev = _prev_obj[i];
if(_prev == noone) continue;
_prev.submitShader(d3_scene_preview);
}
_prev.submitShader(d3_scene_preview);
}
d3_scene_preview.apply();
d3_scene_preview.apply(_defer);
for( var i = 0, n = array_length(_prev_obj); i < n; i++ ) {
var _prev = _prev_obj[i];
if(_prev == noone) continue;
_prev.submitUI(d3_scene_preview); //////////////// SUBMIT ////////////////
}
for( var i = 0, n = array_length(_prev_obj); i < n; i++ ) {
var _prev = _prev_obj[i];
if(_prev == noone) continue;
_prev.submitUI(d3_scene_preview); //////////////// SUBMIT ////////////////
}
gpu_set_cullmode(cull_noculling);
@ -909,7 +907,7 @@ function Panel_Preview() : PanelContent() constructor {
draw_surface_safe(d3_surface);
BLEND_MULTIPLY
draw_surface_safe(d3_scene_preview.ssao);
draw_surface_safe(_defer.ssao);
BLEND_NORMAL
//draw_clear(c_white);
@ -919,7 +917,7 @@ function Panel_Preview() : PanelContent() constructor {
case 2 : draw_surface_safe(d3_surface_depth); break;
}
//draw_surface_stretched_safe(d3_scene_light0.shadow_map, 64, 64, 128, 128);
draw_surface_stretched_safe(d3_scene_light0.shadow_map, 64, 64, 128, 128);
#endregion
#region outline
@ -931,7 +929,7 @@ function Panel_Preview() : PanelContent() constructor {
surface_set_target(d3_surface_outline);
draw_clear(c_black);
d3_view_camera.applyCamera();
d3_scene_preview.camera.applyCamera();
gpu_set_ztestenable(false);
for( var i = 0, n = array_length(_inspect_obj); i < n; i++ ) {
@ -948,7 +946,7 @@ function Panel_Preview() : PanelContent() constructor {
}
#endregion
d3_scene_preview.resetCamera();
d3_scene_preview.camera.resetCamera();
} #endregion
function drawPreviewOverlay() { #region

View file

@ -5,7 +5,7 @@ function Panel_Preview_3D_Setting(panel) : Panel_Linear_Setting() constructor {
preview_panel = panel;
#region data
properties = [
properties_default = [
[
new checkBox(function() { preview_panel.d3_scene_light_enabled = !preview_panel.d3_scene_light_enabled; }),
__txt("Preview Light"),
@ -52,7 +52,18 @@ function Panel_Preview_3D_Setting(panel) : Panel_Linear_Setting() constructor {
function() { return preview_panel.d3_scene.show_normal },
],
]
var scene_camera = [
[ "Currently using camera node settings", THEME.noti_icon_warning, 1, COLORS._main_accent ],
];
properties_camera = array_append(scene_camera, properties_default);
properties = preview_panel.d3_scene_preview == preview_panel.d3_scene? properties_default : properties_camera;
setHeight();
#endregion
function drawContent(panel) {
drawSettings(panel);
}
}

View file

@ -56,11 +56,28 @@ function shader_set_surface(sampler, surface, linear = false, _repeat = false) {
if(!is_surface(surface)) return;
var t = shader_get_sampler_index(shader, sampler);
texture_set_stage(t, surface_get_texture(surface));
gpu_set_tex_filter_ext(t, linear);
gpu_set_tex_repeat_ext(t, _repeat);
}
//function shader_set_surface_ext(sampler, surface, linear = false, _repeat = false) {
// var shader = shader_current();
// if(!is_surface(surface)) return;
// if (!GMD3D11_IS_SUPPORTED) {
// shader_set_surface(sampler, surface, linear, _repeat);
// return;
// }
// var t = shader_get_sampler_index(shader, sampler);
// gpu_set_tex_filter_ext(t, linear);
// gpu_set_tex_repeat_ext(t, _repeat);
// d3d11_texture_set_stage_ps(t, surface_get_texture(surface));
//}
function shader_set_surface_dimension(uniform, surface) {
var shader = shader_current();
if(!is_surface(surface)) return;

View file

@ -27,6 +27,8 @@ varying float v_cameraDistance;
uniform float light_dir_shadow_bias[LIGHT_DIR_LIMIT];
uniform sampler2D light_dir_shadowmap_0;
uniform sampler2D light_dir_shadowmap_1;
//uniform sampler2D light_dir_shadowmap_2;
//uniform sampler2D light_dir_shadowmap_3;
#define LIGHT_PNT_LIMIT 16
uniform int light_pnt_count;
@ -41,6 +43,8 @@ varying float v_cameraDistance;
uniform float light_pnt_shadow_bias[LIGHT_DIR_LIMIT];
uniform sampler2D light_pnt_shadowmap_0;
uniform sampler2D light_pnt_shadowmap_1;
//uniform sampler2D light_pnt_shadowmap_2;
//uniform sampler2D light_pnt_shadowmap_3;
#endregion
#region ---- material ----
@ -93,6 +97,8 @@ varying float v_cameraDistance;
float sampleDirShadowMap(int index, vec2 position) {
if(index == 0) return texture2D(light_dir_shadowmap_0, position).r;
if(index == 1) return texture2D(light_dir_shadowmap_1, position).r;
//if(index == 2) return texture2D(light_dir_shadowmap_2, position).r;
//if(index == 3) return texture2D(light_dir_shadowmap_3, position).r;
return 0.;
}
@ -105,6 +111,8 @@ varying float v_cameraDistance;
if(index == 0) return texture2D(light_pnt_shadowmap_0, position)[side];
if(index == 1) return texture2D(light_pnt_shadowmap_1, position)[side];
//if(index == 2) return texture2D(light_pnt_shadowmap_2, position)[side];
//if(index == 3) return texture2D(light_pnt_shadowmap_3, position)[side];
return 0.;
}
#endregion