diff --git a/scripts/d3d_group/d3d_group.gml b/scripts/d3d_group/d3d_group.gml index 497c5fd57..3f345c1a6 100644 --- a/scripts/d3d_group/d3d_group.gml +++ b/scripts/d3d_group/d3d_group.gml @@ -34,6 +34,8 @@ function __3dGroup() constructor { _m1 = _m1 == noone? _n1 : _m1.maxVal(_n1); } + if(_m0 == noone) return new __bbox3D(new __vec3(-0.5), new __vec3(0.5)); + _m0._subtract(_cc); _m1._subtract(_cc); diff --git a/scripts/d3d_light_point/d3d_light_point.gml b/scripts/d3d_light_point/d3d_light_point.gml index 1fd005521..9077a98f9 100644 --- a/scripts/d3d_light_point/d3d_light_point.gml +++ b/scripts/d3d_light_point/d3d_light_point.gml @@ -3,8 +3,8 @@ function __3dLightPoint() : __3dLight() constructor { intensity = 1; radius = 10; - shadow_mapper = sh_d3d_shadow_depth; - shadow_map_size = 512; + shadow_mapper = sh_d3d_shadow_depth; + shadow_map_size = 512; shadow_map_views = array_create(6); shadow_maps = array_create(6); diff --git a/scripts/d3d_material/d3d_material.gml b/scripts/d3d_material/d3d_material.gml index accadcde7..011ed8308 100644 --- a/scripts/d3d_material/d3d_material.gml +++ b/scripts/d3d_material/d3d_material.gml @@ -1,12 +1,31 @@ function __d3dMaterial(surface = noone) constructor { self.surface = surface; + self.diffuse = 1; self.specular = 0; self.metalic = false; self.shine = 1; + self.normal = noone; + self.normalStr = 1; + + self.reflective = 0; + static getTexture = function() { if(!is_surface(surface)) return -1; return surface_get_texture(surface); } + + static submitShader = function() { + shader_set_f("mat_diffuse", diffuse ); + shader_set_f("mat_specular", specular ); + shader_set_f("mat_shine", shine ); + shader_set_i("mat_metalic", metalic ); + + shader_set_i("mat_use_normal", is_surface(normal)); + shader_set_surface("mat_normal_map", normal); + shader_set_f("mat_normal_strength", normalStr); + + shader_set_f("mat_reflective", reflective); + } } \ No newline at end of file diff --git a/scripts/d3d_object/d3d_object.gml b/scripts/d3d_object/d3d_object.gml index b02d95852..273b8c2f5 100644 --- a/scripts/d3d_object/d3d_object.gml +++ b/scripts/d3d_object/d3d_object.gml @@ -132,7 +132,7 @@ function __3dObject() constructor { preSubmitVertex(params); - if(VB != noone) { + if(VB != noone) { #region matrix_stack_clear(); if(params.apply_transform) { @@ -164,26 +164,35 @@ function __3dObject() constructor { matrix_stack_push(sca); matrix_set(matrix_world, matrix_stack_top()); } - } + } #endregion - if(VF == global.VF_POS_NORM_TEX_COL) - for( var i = 0, n = array_length(VB); i < n; i++ ) { - var _mat = array_safe_get(materials, i, noone); - var _tex = _mat == noone? -1 : _mat.getTexture(); + #region ++++ Submit & Material ++++ + for( var i = 0, n = array_length(VB); i < n; i++ ) { + if(VF == global.VF_POS_NORM_TEX_COL) { + var _mat = array_safe_get(materials, i, noone); + if(_mat == noone) { + shader_set_f("mat_diffuse", 1); + shader_set_f("mat_specular", 0); + shader_set_f("mat_shine", 1); + shader_set_i("mat_metalic", 0); + shader_set_i("mat_use_normal", 0); + shader_set_f("mat_reflective", 0); + } else + _mat.submitShader(); - shader_set_f("mat_diffuse", _mat == noone? 1 : _mat.diffuse ); - shader_set_f("mat_specular", _mat == noone? 0 : _mat.specular ); - shader_set_f("mat_shine", _mat == noone? 1 : _mat.shine ); - shader_set_i("mat_metalic", _mat == noone? 0 : _mat.metalic ); - vertex_submit(VB[i], render_type, _tex); - } + var _tex = _mat == noone? -1 : _mat.getTexture(); + vertex_submit(VB[i], render_type, _tex); + } else + vertex_submit(VB[i], render_type, -1); + } + #endregion - if(params.show_normal && NVB != noone) { + if(params.show_normal && NVB != noone) { #region shader_set(sh_d3d_wireframe); for( var i = 0, n = array_length(NVB); i < n; i++ ) vertex_submit(NVB[i], pr_linelist, -1); shader_reset(); - } + } #endregion matrix_stack_clear(); matrix_set(matrix_world, matrix_build_identity()); diff --git a/scripts/d3d_scene/d3d_scene.gml b/scripts/d3d_scene/d3d_scene.gml index 0842d9acc..57a398dd2 100644 --- a/scripts/d3d_scene/d3d_scene.gml +++ b/scripts/d3d_scene/d3d_scene.gml @@ -72,6 +72,8 @@ function __3dScene(camera) constructor { lightPnt_viewMat = []; lightPnt_projMat = []; lightPnt_shadowBias = []; + + enviroment_map = noone; } reset(); static applyCamera = function() { camera.applyCamera(); } @@ -105,17 +107,21 @@ function __3dScene(camera) constructor { 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_ont_shadow_bias", lightPnt_shadowBias); + shader_set_f("light_pnt_shadow_bias", lightPnt_shadowBias); } shader_set_f("cameraPosition", camera.position.toArray()); shader_set_i("gammaCorrection", gammaCorrection); shader_set_f("planeNear", camera.view_near); shader_set_f("planeFar", camera.view_far ); + + shader_set_i("env_use_mapping", is_surface(enviroment_map) ); + shader_set_surface("env_map", enviroment_map ); + shader_set_dim("env_map_dimension", enviroment_map ); shader_reset(); } - static addLightDirectional = function(light) { + static addLightDirectional = function(light) { #region if(lightDir_count >= lightDir_max) { noti_warning("Direction light limit exceeded"); return self; @@ -136,13 +142,13 @@ function __3dScene(camera) constructor { } array_append(lightDir_viewMat, light.shadow_map_view); array_append(lightDir_projMat, light.shadow_map_proj); - array_append(lightDir_shadowBias, light.shadow_bias); + array_push(lightDir_shadowBias, light.shadow_bias); lightDir_count++; return self; - } + } #endregion - static addLightPoint = function(light) { + static addLightPoint = function(light) { #region if(lightPnt_count >= lightPnt_max) { noti_warning("Point light limit exceeded"); return self; @@ -164,9 +170,9 @@ function __3dScene(camera) constructor { } array_append(lightPnt_viewMat, light.shadow_map_view); array_append(lightPnt_projMat, light.shadow_map_proj); - array_append(lightPnt_shadowBias, light.shadow_bias); + array_push(lightPnt_shadowBias, light.shadow_bias); lightPnt_count++; return self; - } + } #endregion } \ No newline at end of file diff --git a/scripts/nodeValue_drawer/nodeValue_drawer.gml b/scripts/nodeValue_drawer/nodeValue_drawer.gml index b68a8f707..704fc5194 100644 --- a/scripts/nodeValue_drawer/nodeValue_drawer.gml +++ b/scripts/nodeValue_drawer/nodeValue_drawer.gml @@ -228,9 +228,18 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc break; } break; - case VALUE_TYPE.boolean : param.halign = lineBreak? fa_left : fa_center; - case VALUE_TYPE.surface : param.h = ui(96); break; - case VALUE_TYPE.curve : param.h = ui(160); + + case VALUE_TYPE.boolean : + param.halign = lineBreak? fa_left : fa_center; + break; + + case VALUE_TYPE.d3Material : + case VALUE_TYPE.surface : + param.h = ui(96); + break; + + case VALUE_TYPE.curve : + param.h = ui(160); if(point_in_rectangle(_m[0], _m[1], ui(32), _hsy, ui(32) + ww - ui(16), _hsy + editBoxH)) mbRight = false; break; diff --git a/scripts/node_3d_camera/node_3d_camera.gml b/scripts/node_3d_camera/node_3d_camera.gml index 1471cd57e..4bfbb7885 100644 --- a/scripts/node_3d_camera/node_3d_camera.gml +++ b/scripts/node_3d_camera/node_3d_camera.gml @@ -57,6 +57,8 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) inputs[| in_d3d + 15] = nodeValue("Gamma Adjust", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ); + inputs[| in_d3d + 16] = nodeValue("Environment Texture", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); + outputs[| 0] = nodeValue("Rendered", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone ); outputs[| 1] = nodeValue("Normal", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone ) @@ -69,7 +71,7 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) ["Output", false], in_d3d + 2, ["Transform", false], in_d3d + 9, 0, 1, in_d3d + 10, in_d3d + 11, in_d3d + 12, in_d3d + 13, in_d3d + 14, ["Camera", false], in_d3d + 3, in_d3d + 0, in_d3d + 1, in_d3d + 8, - ["Render", false], in_d3d + 5, in_d3d + 6, in_d3d + 7, in_d3d + 15, + ["Render", false], in_d3d + 5, in_d3d + 16, in_d3d + 6, in_d3d + 7, in_d3d + 15, ]; tool_lookat = new NodeTool( "Move Target", THEME.tools_3d_transform_object ); @@ -164,6 +166,7 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) var _vAng = _data[in_d3d + 13]; var _dist = _data[in_d3d + 14]; var _gamm = _data[in_d3d + 15]; + var _env = _data[in_d3d + 16]; var _qi1 = new BBMOD_Quaternion().FromAxisAngle(new BBMOD_Vec3(0, 1, 0), 90); var _qi2 = new BBMOD_Quaternion().FromAxisAngle(new BBMOD_Vec3(1, 0, 0), -90); @@ -220,9 +223,6 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) if(_proj == 0) camera.setViewSize(_dim[0], _dim[1]); else if(_proj == 1) camera.setViewSize(1 / _orts, _dim[0] / _dim[1] / _orts); - scene.lightAmbient = _ambt; - _scne.gammaCorrection = _gamm; - var _render = surface_create(_dim[0], _dim[1]); var _normal = surface_create(_dim[0], _dim[1]); var _depth = surface_create(_dim[0], _dim[1]); @@ -242,6 +242,10 @@ function Node_3D_Camera(_x, _y, _group = noone) : Node_3D_Object(_x, _y, _group) camera.applyCamera(); scene.reset(); + scene.lightAmbient = _ambt; + scene.gammaCorrection = _gamm; + scene.enviroment_map = _env; + _scne.submitShader(scene); scene.apply(); diff --git a/scripts/node_3d_light_point/node_3d_light_point.gml b/scripts/node_3d_light_point/node_3d_light_point.gml index fa00c6d97..c000b15e1 100644 --- a/scripts/node_3d_light_point/node_3d_light_point.gml +++ b/scripts/node_3d_light_point/node_3d_light_point.gml @@ -40,4 +40,9 @@ function Node_3D_Light_Point(_x, _y, _group = noone) : Node_3D_Light(_x, _y, _gr return object; } + + //static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { + // var object = getObject(0); + // draw_surface_stretched_safe(object.shadow_map, xx, yy, 96, 96); + //} } \ No newline at end of file diff --git a/scripts/node_3d_material/node_3d_material.gml b/scripts/node_3d_material/node_3d_material.gml index 22a6a1b04..7345505f1 100644 --- a/scripts/node_3d_material/node_3d_material.gml +++ b/scripts/node_3d_material/node_3d_material.gml @@ -2,27 +2,43 @@ function Node_3D_Material(_x, _y, _group = noone) : Node_3D(_x, _y, _group) cons name = "3D Material"; solid_surf = noone; - inputs[| 0] = nodeValue("Texture", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone) + inputs[| 0] = nodeValue("Texture", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ) .setVisible(true, true); - inputs[| 1] = nodeValue("Diffuse", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1) + inputs[| 1] = nodeValue("Diffuse", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1 ) .setDisplay(VALUE_DISPLAY.slider, [ 0, 1, 0.01 ]); - inputs[| 2] = nodeValue("Specular", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0) + inputs[| 2] = nodeValue("Specular", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0 ) .setDisplay(VALUE_DISPLAY.slider, [ 0, 1, 0.01 ]); - inputs[| 3] = nodeValue("Shininess", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1); + inputs[| 3] = nodeValue("Shininess", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1 ); - inputs[| 4] = nodeValue("Metalic", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false); + inputs[| 4] = nodeValue("Metalic", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ); + + inputs[| 5] = nodeValue("Normal Map", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ); + + inputs[| 6] = nodeValue("Normal Strength", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1 ) + .setDisplay(VALUE_DISPLAY.slider, [ 0, 2, 0.01 ]); + + inputs[| 7] = nodeValue("Roughness", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1 ) + .setDisplay(VALUE_DISPLAY.slider, [ 0, 1, 0.01 ]); outputs[| 0] = nodeValue("Material", self, JUNCTION_CONNECT.output, VALUE_TYPE.d3Material, noone); + input_display_list = [ 0, + ["Properties", false], 1, 2, 3, 4, 7, + ["Normal", false], 5, 6, + ]; + static processData = function(_output, _data, _output_index, _array_index = 0) { var _surf = _data[0]; var _diff = _data[1]; var _spec = _data[2]; var _shin = _data[3]; var _metl = _data[4]; + var _nor = _data[5]; + var _norS = _data[6]; + var _roug = _data[7]; if(!is_surface(_surf)) { solid_surf = surface_verify(solid_surf, 1, 1); @@ -35,6 +51,10 @@ function Node_3D_Material(_x, _y, _group = noone) : Node_3D(_x, _y, _group) cons _mat.shine = _shin; _mat.metalic = _metl; + _mat.normal = _nor; + _mat.normalStr = _norS; + _mat.reflective = clamp(1 - _roug, 0, 1); + return _mat; } diff --git a/scripts/node_3d_mesh_cone/node_3d_mesh_cone.gml b/scripts/node_3d_mesh_cone/node_3d_mesh_cone.gml index a77abf388..72aabe610 100644 --- a/scripts/node_3d_mesh_cone/node_3d_mesh_cone.gml +++ b/scripts/node_3d_mesh_cone/node_3d_mesh_cone.gml @@ -5,9 +5,11 @@ function Node_3D_Mesh_Cone(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _group inputs[| in_mesh + 0] = nodeValue("Side", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 8 ); - inputs[| in_mesh + 1] = nodeValue("Material Bottom", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ); + inputs[| in_mesh + 1] = nodeValue("Material Bottom", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ) + .setVisible(true, true); - inputs[| in_mesh + 2] = nodeValue("Material Side", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ); + inputs[| in_mesh + 2] = nodeValue("Material Side", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ) + .setVisible(true, true); inputs[| in_mesh + 3] = nodeValue("Smooth Side", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ); diff --git a/scripts/node_3d_mesh_cube/node_3d_mesh_cube.gml b/scripts/node_3d_mesh_cube/node_3d_mesh_cube.gml index 147b83302..ee082a7bf 100644 --- a/scripts/node_3d_mesh_cube/node_3d_mesh_cube.gml +++ b/scripts/node_3d_mesh_cube/node_3d_mesh_cube.gml @@ -5,17 +5,23 @@ function Node_3D_Mesh_Cube(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _group inputs[| in_mesh + 0] = nodeValue("Material per side", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ); - inputs[| in_mesh + 1] = nodeValue("Material", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ); + inputs[| in_mesh + 1] = nodeValue("Material", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ) + .setVisible(true, true); - inputs[| in_mesh + 2] = nodeValue("Material Bottom", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ); + inputs[| in_mesh + 2] = nodeValue("Material Bottom", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ) + .setVisible(true, true); - inputs[| in_mesh + 3] = nodeValue("Material Left", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ); + inputs[| in_mesh + 3] = nodeValue("Material Left", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ) + .setVisible(true, true); - inputs[| in_mesh + 4] = nodeValue("Material Right", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ); + inputs[| in_mesh + 4] = nodeValue("Material Right", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ) + .setVisible(true, true); - inputs[| in_mesh + 5] = nodeValue("Material Back", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ); + inputs[| in_mesh + 5] = nodeValue("Material Back", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ) + .setVisible(true, true); - inputs[| in_mesh + 6] = nodeValue("Material Front", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ); + inputs[| in_mesh + 6] = nodeValue("Material Front", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ) + .setVisible(true, true); input_display_list = [ __d3d_input_list_mesh, diff --git a/scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.gml b/scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.gml index 6209543f4..3a42aa20e 100644 --- a/scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.gml +++ b/scripts/node_3d_mesh_cylinder/node_3d_mesh_cylinder.gml @@ -5,11 +5,14 @@ function Node_3D_Mesh_Cylinder(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _g inputs[| in_mesh + 0] = nodeValue("Side", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 8 ); - inputs[| in_mesh + 1] = nodeValue("Material Top", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ); + inputs[| in_mesh + 1] = nodeValue("Material Top", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ) + .setVisible(true, true); - inputs[| in_mesh + 2] = nodeValue("Material Bottom", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ); + inputs[| in_mesh + 2] = nodeValue("Material Bottom", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ) + .setVisible(true, true); - inputs[| in_mesh + 3] = nodeValue("Material Side", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ); + inputs[| in_mesh + 3] = nodeValue("Material Side", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ) + .setVisible(true, true); inputs[| in_mesh + 4] = nodeValue("Smooth Side", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ); diff --git a/scripts/node_3d_mesh_extrude/node_3d_mesh_extrude.gml b/scripts/node_3d_mesh_extrude/node_3d_mesh_extrude.gml index fefc7af34..72dfe2f3f 100644 --- a/scripts/node_3d_mesh_extrude/node_3d_mesh_extrude.gml +++ b/scripts/node_3d_mesh_extrude/node_3d_mesh_extrude.gml @@ -3,7 +3,8 @@ function Node_3D_Mesh_Extrude(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _gr object_class = __3dSurfaceExtrude; - inputs[| in_mesh + 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone); + inputs[| in_mesh + 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone) + .setVisible(true, true); inputs[| in_mesh + 1] = nodeValue("Height map", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone); diff --git a/scripts/node_3d_mesh_icosphere/node_3d_mesh_icosphere.gml b/scripts/node_3d_mesh_icosphere/node_3d_mesh_icosphere.gml index 5a24d5cf3..429a4e059 100644 --- a/scripts/node_3d_mesh_icosphere/node_3d_mesh_icosphere.gml +++ b/scripts/node_3d_mesh_icosphere/node_3d_mesh_icosphere.gml @@ -5,7 +5,8 @@ function Node_3D_Mesh_Sphere_Ico(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, inputs[| in_mesh + 0] = nodeValue("Subdivision", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 1 ); - inputs[| in_mesh + 1] = nodeValue("Material", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ); + inputs[| in_mesh + 1] = nodeValue("Material", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ) + .setVisible(true, true); inputs[| in_mesh + 2] = nodeValue("Smooth Normal", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ); diff --git a/scripts/node_3d_mesh_plane/node_3d_mesh_plane.gml b/scripts/node_3d_mesh_plane/node_3d_mesh_plane.gml index e0beddce8..738fff475 100644 --- a/scripts/node_3d_mesh_plane/node_3d_mesh_plane.gml +++ b/scripts/node_3d_mesh_plane/node_3d_mesh_plane.gml @@ -3,7 +3,8 @@ function Node_3D_Mesh_Plane(_x, _y, _group = noone) : Node_3D_Mesh(_x, _y, _grou object_class = __3dPlane; - inputs[| in_mesh + 0] = nodeValue("Material", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ); + inputs[| in_mesh + 0] = nodeValue("Material", self, JUNCTION_CONNECT.input, VALUE_TYPE.d3Material, noone ) + .setVisible(true, true); inputs[| in_mesh + 1] = nodeValue("Normal", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 2 ) .setDisplay(VALUE_DISPLAY.enum_button, [ "X", "Y", "Z" ]); diff --git a/scripts/node_value/node_value.gml b/scripts/node_value/node_value.gml index 763201901..277c95ce7 100644 --- a/scripts/node_value/node_value.gml +++ b/scripts/node_value/node_value.gml @@ -961,6 +961,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru break; } break; #endregion + case VALUE_TYPE.d3Material : case VALUE_TYPE.surface : #region editWidget = new surfaceBox(function(ind) { return setValueDirect(ind); diff --git a/shaders/sh_d3d_default/sh_d3d_default.fsh b/shaders/sh_d3d_default/sh_d3d_default.fsh index 0512480ea..0cc7c4360 100644 --- a/shaders/sh_d3d_default/sh_d3d_default.fsh +++ b/shaders/sh_d3d_default/sh_d3d_default.fsh @@ -1,5 +1,4 @@ // PC3D rendering shader -// - BRDF By Xpanda and OGLDEV varying vec2 v_vTexcoord; varying vec4 v_vColour; @@ -46,10 +45,6 @@ varying float v_cameraDistance; uniform sampler2D light_pnt_shadowmap_1; uniform sampler2D light_pnt_shadowmap_2; uniform sampler2D light_pnt_shadowmap_3; - uniform sampler2D light_pnt_shadowmap_4; - uniform sampler2D light_pnt_shadowmap_5; - uniform sampler2D light_pnt_shadowmap_6; - uniform sampler2D light_pnt_shadowmap_7; #endregion #region ---- material ---- @@ -59,11 +54,20 @@ varying float v_cameraDistance; uniform float mat_specular; uniform float mat_shine; uniform int mat_metalic; + uniform float mat_reflective; + + uniform int mat_use_normal; + uniform float mat_normal_strength; + uniform sampler2D mat_normal_map; #endregion #region ---- rendering ---- uniform vec3 cameraPosition; uniform int gammaCorrection; + + uniform int env_use_mapping; + uniform sampler2D env_map; + uniform vec2 env_map_dimension; #endregion #region ++++ matrix ++++ @@ -132,17 +136,29 @@ varying float v_cameraDistance; } #endregion +#region ++++ mapping ++++ + vec2 equirectangularUv(vec3 dir) { + vec3 n = normalize(dir); + return vec2((atan(n.x, n.y) / TAU) + 0.5, 1. - acos(n.z) / PI); + } +#endregion + void main() { mat_baseColor = texture2D( gm_BaseTexture, v_vTexcoord ); mat_baseColor *= v_vColour; vec4 final_color = mat_baseColor; - vec3 normal = normalize(v_vNormal); vec3 viewDirection = normalize(cameraPosition - v_worldPosition.xyz); - gl_FragData[0] = vec4(0.); - gl_FragData[1] = vec4(0.); - gl_FragData[2] = vec4(0.); + #region ++++ normal ++++ + vec3 _norm = v_vNormal; + if(mat_use_normal == 1) { + vec3 _sampled_normal = texture2D(mat_normal_map, v_vTexcoord).rgb; + _norm += (_sampled_normal - 0.5) * 2. * mat_normal_strength; + } + + vec3 normal = normalize(_norm); + #endregion #region ++++ light ++++ int shadow_map_index = 0; @@ -150,7 +166,6 @@ void main() { float val = 0.; #region ++++ directional ++++ - float light_dir_strength; float light_map_depth; float lightDistance; float shadow_culled; @@ -158,10 +173,7 @@ void main() { shadow_map_index = 0; for(int i = 0; i < light_dir_count; i++) { vec3 lightVector = normalize(light_dir_direction[i]); - //light_dir_strength = dot(normal, lightVector); - //if(light_dir_strength < 0.) - // continue; - + if(light_dir_shadow_active[i] == 1) { vec4 cameraSpace = light_dir_view[i] * v_worldPosition; vec4 screenSpace = light_dir_proj[i] * cameraSpace; @@ -179,7 +191,6 @@ void main() { continue; } - //light_dir_strength = max(light_dir_strength * light_dir_intensity[i], 0.); vec3 light_phong = phongLight(normal, lightVector, viewDirection, light_dir_color[i].rgb); light_effect += light_phong; @@ -187,17 +198,13 @@ void main() { #endregion #region ++++ point ++++ - float light_pnt_strength; float light_distance; float light_attenuation; shadow_map_index = 0; for(int i = 0; i < light_pnt_count; i++) { vec3 lightVector = normalize(light_pnt_position[i] - v_worldPosition.xyz); - //light_pnt_strength = dot(normal, lightVector); - //if(light_pnt_strength < 0.) - // continue; - + light_distance = length(lightVector); if(light_distance > light_pnt_radius[i]) continue; @@ -208,14 +215,15 @@ void main() { (dirAbs.x > dirAbs.z ? 0 : 2) : (dirAbs.y > dirAbs.z ? 1 : 2); side *= 2; - if(side == 0 && lightVector.x < 0.) side += 1; - else if(side == 2 && lightVector.y < 0.) side += 1; - else if(side == 4 && lightVector.z < 0.) side += 1; + if(side == 0 && lightVector.x > 0.) side += 1; + else if(side == 2 && lightVector.y > 0.) side += 1; + else if(side == 4 && lightVector.z > 0.) side += 1; - vec4 cameraSpace = light_pnt_view[i * 6 + side] * v_worldPosition; - vec4 screenSpace = light_pnt_proj[i] * cameraSpace; + vec4 cameraSpace = light_pnt_view[i * 6 + side] * v_worldPosition; + vec4 screenSpace = light_pnt_proj[i] * cameraSpace; float v_lightDistance = screenSpace.z / screenSpace.w; vec2 lightMapPosition = (screenSpace.xy / screenSpace.w * 0.5) + 0.5; + float shadowFactor = dot(normal, lightVector); float bias = mix(light_pnt_shadow_bias[i], 0., shadowFactor); @@ -227,8 +235,7 @@ void main() { } light_attenuation = 1. - pow(light_distance / light_pnt_radius[i], 2.); - - //light_pnt_strength = max(light_pnt_strength * light_pnt_intensity[i] * light_attenuation, 0.); + vec3 light_phong = phongLight(normal, lightVector, viewDirection, light_pnt_color[i].rgb * light_attenuation); light_effect += light_phong; @@ -246,7 +253,34 @@ void main() { final_color.rgb *= light_effect; #endregion + #region ++++ environment ++++ + if(env_use_mapping == 1) { + vec3 reflectDir = reflect(viewDirection, normal); + + float refRad = mix(16., 0., mat_reflective); + vec2 tx = 1. / env_map_dimension; + vec2 reflect_sample_pos = equirectangularUv(reflectDir); + vec4 env_sampled = vec4(0.); + float weight = 0.; + + for(float i = -refRad; i <= refRad; i++) + for(float j = -refRad; j <= refRad; j++) { + vec2 _map_pos = reflect_sample_pos + vec2(i, j) * tx; + vec4 _samp = texture2D(env_map, _map_pos); + env_sampled += _samp; + weight += _samp.a; + } + env_sampled /= weight; + env_sampled.a = 1.; + + vec4 env_effect = mat_metalic == 1? env_sampled * final_color : env_sampled; + env_effect = 1. - ( mat_reflective * ( 1. - env_effect )); + + final_color *= env_effect; + } + #endregion + gl_FragData[0] = final_color; gl_FragData[1] = vec4(0.5 + normal * 0.5, 1.); - gl_FragData[2] = vec4(vec3(v_cameraDistance), 1.); + gl_FragData[2] = vec4(vec3(v_cameraDistance), 1.); }