2017-03-27 00:28:52 -04:00
|
|
|
|
2017-05-18 14:29:57 +02:00
|
|
|
uniform mat4 ModelMatrix;
|
2018-03-10 00:00:04 +01:00
|
|
|
uniform mat4 ModelViewMatrix;
|
2017-03-27 00:28:52 -04:00
|
|
|
uniform mat4 ModelViewMatrixInverse;
|
|
|
|
uniform mat3 NormalMatrix;
|
|
|
|
|
2018-05-29 12:14:14 +02:00
|
|
|
#ifndef ATTRIB
|
|
|
|
uniform mat4 ModelMatrixInverse;
|
|
|
|
#endif
|
|
|
|
|
2016-02-02 12:48:18 +01:00
|
|
|
/* Converters */
|
|
|
|
|
|
|
|
float convert_rgba_to_float(vec4 color)
|
|
|
|
{
|
2017-05-19 14:20:08 -04:00
|
|
|
return dot(color.rgb, vec3(0.2126, 0.7152, 0.0722));
|
2016-02-02 12:48:18 +01:00
|
|
|
}
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
|
|
|
|
float exp_blender(float f)
|
|
|
|
{
|
|
|
|
return pow(2.71828182846, f);
|
|
|
|
}
|
|
|
|
|
2012-11-06 19:58:48 +00:00
|
|
|
float compatible_pow(float x, float y)
|
|
|
|
{
|
2016-05-23 10:31:36 +02:00
|
|
|
if (y == 0.0) /* x^0 -> 1, including 0^0 */
|
2014-01-14 22:58:07 +04:00
|
|
|
return 1.0;
|
|
|
|
|
2012-11-06 19:58:48 +00:00
|
|
|
/* glsl pow doesn't accept negative x */
|
2016-05-23 10:31:36 +02:00
|
|
|
if (x < 0.0) {
|
|
|
|
if (mod(-y, 2.0) == 0.0)
|
2012-11-06 19:58:48 +00:00
|
|
|
return pow(-x, y);
|
|
|
|
else
|
|
|
|
return -pow(-x, y);
|
|
|
|
}
|
2016-05-23 10:31:36 +02:00
|
|
|
else if (x == 0.0)
|
2012-11-06 19:58:48 +00:00
|
|
|
return 0.0;
|
|
|
|
|
|
|
|
return pow(x, y);
|
|
|
|
}
|
|
|
|
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
void rgb_to_hsv(vec4 rgb, out vec4 outcol)
|
|
|
|
{
|
|
|
|
float cmax, cmin, h, s, v, cdelta;
|
|
|
|
vec3 c;
|
|
|
|
|
|
|
|
cmax = max(rgb[0], max(rgb[1], rgb[2]));
|
|
|
|
cmin = min(rgb[0], min(rgb[1], rgb[2]));
|
2016-05-26 18:46:12 +10:00
|
|
|
cdelta = cmax - cmin;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
|
|
|
|
v = cmax;
|
2016-05-26 18:46:12 +10:00
|
|
|
if (cmax != 0.0)
|
|
|
|
s = cdelta / cmax;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
else {
|
|
|
|
s = 0.0;
|
|
|
|
h = 0.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (s == 0.0) {
|
|
|
|
h = 0.0;
|
|
|
|
}
|
|
|
|
else {
|
2017-05-19 14:20:08 -04:00
|
|
|
c = (vec3(cmax) - rgb.xyz) / cdelta;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
if (rgb.x == cmax) h = c[2] - c[1];
|
|
|
|
else if (rgb.y == cmax) h = 2.0 + c[0] - c[2];
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
else h = 4.0 + c[1] - c[0];
|
|
|
|
|
|
|
|
h /= 6.0;
|
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
if (h < 0.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
h += 1.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
outcol = vec4(h, s, v, rgb.w);
|
|
|
|
}
|
|
|
|
|
|
|
|
void hsv_to_rgb(vec4 hsv, out vec4 outcol)
|
|
|
|
{
|
|
|
|
float i, f, p, q, t, h, s, v;
|
|
|
|
vec3 rgb;
|
|
|
|
|
|
|
|
h = hsv[0];
|
|
|
|
s = hsv[1];
|
|
|
|
v = hsv[2];
|
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
if (s == 0.0) {
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
rgb = vec3(v, v, v);
|
|
|
|
}
|
|
|
|
else {
|
2016-05-26 18:46:12 +10:00
|
|
|
if (h == 1.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
h = 0.0;
|
2016-05-26 18:46:12 +10:00
|
|
|
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
h *= 6.0;
|
|
|
|
i = floor(h);
|
|
|
|
f = h - i;
|
|
|
|
rgb = vec3(f, f, f);
|
2016-05-26 18:46:12 +10:00
|
|
|
p = v * (1.0 - s);
|
|
|
|
q = v * (1.0 - (s * f));
|
|
|
|
t = v * (1.0 - (s * (1.0 - f)));
|
|
|
|
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
if (i == 0.0) rgb = vec3(v, t, p);
|
|
|
|
else if (i == 1.0) rgb = vec3(q, v, p);
|
|
|
|
else if (i == 2.0) rgb = vec3(p, v, t);
|
|
|
|
else if (i == 3.0) rgb = vec3(p, q, v);
|
|
|
|
else if (i == 4.0) rgb = vec3(t, p, v);
|
|
|
|
else rgb = vec3(v, p, q);
|
|
|
|
}
|
|
|
|
|
|
|
|
outcol = vec4(rgb, hsv.w);
|
|
|
|
}
|
|
|
|
|
2010-07-29 10:09:20 +00:00
|
|
|
float srgb_to_linearrgb(float c)
|
|
|
|
{
|
2016-05-23 10:31:36 +02:00
|
|
|
if (c < 0.04045)
|
2016-05-26 18:46:12 +10:00
|
|
|
return (c < 0.0) ? 0.0 : c * (1.0 / 12.92);
|
2010-07-29 10:09:20 +00:00
|
|
|
else
|
2016-05-26 18:46:12 +10:00
|
|
|
return pow((c + 0.055) * (1.0 / 1.055), 2.4);
|
2010-07-29 10:09:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
float linearrgb_to_srgb(float c)
|
|
|
|
{
|
2016-05-23 10:31:36 +02:00
|
|
|
if (c < 0.0031308)
|
2016-05-26 18:46:12 +10:00
|
|
|
return (c < 0.0) ? 0.0 : c * 12.92;
|
2010-07-29 10:09:20 +00:00
|
|
|
else
|
2016-05-26 18:46:12 +10:00
|
|
|
return 1.055 * pow(c, 1.0 / 2.4) - 0.055;
|
2010-07-29 10:09:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void srgb_to_linearrgb(vec4 col_from, out vec4 col_to)
|
|
|
|
{
|
|
|
|
col_to.r = srgb_to_linearrgb(col_from.r);
|
|
|
|
col_to.g = srgb_to_linearrgb(col_from.g);
|
|
|
|
col_to.b = srgb_to_linearrgb(col_from.b);
|
|
|
|
col_to.a = col_from.a;
|
|
|
|
}
|
|
|
|
|
|
|
|
void linearrgb_to_srgb(vec4 col_from, out vec4 col_to)
|
|
|
|
{
|
|
|
|
col_to.r = linearrgb_to_srgb(col_from.r);
|
|
|
|
col_to.g = linearrgb_to_srgb(col_from.g);
|
|
|
|
col_to.b = linearrgb_to_srgb(col_from.b);
|
|
|
|
col_to.a = col_from.a;
|
|
|
|
}
|
|
|
|
|
2016-04-26 18:43:02 +10:00
|
|
|
void color_to_normal(vec3 color, out vec3 normal)
|
|
|
|
{
|
|
|
|
normal.x = 2.0 * ((color.r) - 0.5);
|
|
|
|
normal.y = -2.0 * ((color.g) - 0.5);
|
|
|
|
normal.z = 2.0 * ((color.b) - 0.5);
|
|
|
|
}
|
|
|
|
|
2016-05-23 16:12:52 +03:00
|
|
|
void color_to_normal_new_shading(vec3 color, out vec3 normal)
|
|
|
|
{
|
|
|
|
normal.x = 2.0 * ((color.r) - 0.5);
|
|
|
|
normal.y = 2.0 * ((color.g) - 0.5);
|
|
|
|
normal.z = 2.0 * ((color.b) - 0.5);
|
|
|
|
}
|
|
|
|
|
|
|
|
void color_to_blender_normal_new_shading(vec3 color, out vec3 normal)
|
|
|
|
{
|
|
|
|
normal.x = 2.0 * ((color.r) - 0.5);
|
|
|
|
normal.y = -2.0 * ((color.g) - 0.5);
|
|
|
|
normal.z = -2.0 * ((color.b) - 0.5);
|
|
|
|
}
|
2017-05-05 12:10:59 +02:00
|
|
|
#ifndef M_PI
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
#define M_PI 3.14159265358979323846
|
2017-05-05 12:10:59 +02:00
|
|
|
#endif
|
|
|
|
#ifndef M_1_PI
|
2017-04-27 22:27:09 +02:00
|
|
|
#define M_1_PI 0.318309886183790671538
|
2017-05-05 12:10:59 +02:00
|
|
|
#endif
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
|
|
|
|
/*********** SHADER NODES ***************/
|
|
|
|
|
2018-07-10 15:35:59 +02:00
|
|
|
void particle_info(
|
|
|
|
vec4 sprops, vec4 loc, vec3 vel, vec3 avel,
|
|
|
|
out float index, out float random, out float age,
|
|
|
|
out float life_time, out vec3 location,
|
|
|
|
out float size, out vec3 velocity, out vec3 angular_velocity)
|
|
|
|
{
|
|
|
|
index = sprops.x;
|
|
|
|
random = loc.w;
|
|
|
|
age = sprops.y;
|
|
|
|
life_time = sprops.z;
|
|
|
|
size = sprops.w;
|
|
|
|
|
|
|
|
location = loc.xyz;
|
|
|
|
velocity = vel;
|
|
|
|
angular_velocity = avel;
|
|
|
|
}
|
|
|
|
|
Vector Transform node support for GLSL mode and the internal renderer
The Vector Transform node is a useful node which is present in the Cycles renderer.
{F144283}
This patch implements the Vector Transform node for GLSL mode and the internal renderer.
Example: {F273060}
Alexander (Blend4Web Team)
Reviewers: brecht, campbellbarton, sergey
Reviewed By: campbellbarton, sergey
Subscribers: psy-fi, duarteframos, RobM, lightbwk, sergey, AlexKowel, valentin_b4w, Evgeny_Rodygin, yurikovelenov
Projects: #bf_blender:_next
Differential Revision: https://developer.blender.org/D909
2016-01-23 15:27:36 +03:00
|
|
|
void vect_normalize(vec3 vin, out vec3 vout)
|
|
|
|
{
|
|
|
|
vout = normalize(vin);
|
|
|
|
}
|
|
|
|
|
|
|
|
void direction_transform_m4v3(vec3 vin, mat4 mat, out vec3 vout)
|
|
|
|
{
|
2016-05-26 18:46:12 +10:00
|
|
|
vout = (mat * vec4(vin, 0.0)).xyz;
|
Vector Transform node support for GLSL mode and the internal renderer
The Vector Transform node is a useful node which is present in the Cycles renderer.
{F144283}
This patch implements the Vector Transform node for GLSL mode and the internal renderer.
Example: {F273060}
Alexander (Blend4Web Team)
Reviewers: brecht, campbellbarton, sergey
Reviewed By: campbellbarton, sergey
Subscribers: psy-fi, duarteframos, RobM, lightbwk, sergey, AlexKowel, valentin_b4w, Evgeny_Rodygin, yurikovelenov
Projects: #bf_blender:_next
Differential Revision: https://developer.blender.org/D909
2016-01-23 15:27:36 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void point_transform_m4v3(vec3 vin, mat4 mat, out vec3 vout)
|
|
|
|
{
|
2016-05-26 18:46:12 +10:00
|
|
|
vout = (mat * vec4(vin, 1.0)).xyz;
|
Vector Transform node support for GLSL mode and the internal renderer
The Vector Transform node is a useful node which is present in the Cycles renderer.
{F144283}
This patch implements the Vector Transform node for GLSL mode and the internal renderer.
Example: {F273060}
Alexander (Blend4Web Team)
Reviewers: brecht, campbellbarton, sergey
Reviewed By: campbellbarton, sergey
Subscribers: psy-fi, duarteframos, RobM, lightbwk, sergey, AlexKowel, valentin_b4w, Evgeny_Rodygin, yurikovelenov
Projects: #bf_blender:_next
Differential Revision: https://developer.blender.org/D909
2016-01-23 15:27:36 +03:00
|
|
|
}
|
|
|
|
|
2016-05-30 10:23:43 +02:00
|
|
|
void point_texco_remap_square(vec3 vin, out vec3 vout)
|
|
|
|
{
|
|
|
|
vout = vec3(vin - vec3(0.5, 0.5, 0.5)) * 2.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void point_map_to_sphere(vec3 vin, out vec3 vout)
|
|
|
|
{
|
|
|
|
float len = length(vin);
|
|
|
|
float v, u;
|
|
|
|
if (len > 0.0) {
|
|
|
|
if (vin.x == 0.0 && vin.y == 0.0)
|
|
|
|
u = 0.0;
|
|
|
|
else
|
|
|
|
u = (1.0 - atan(vin.x, vin.y) / M_PI) / 2.0;
|
|
|
|
|
|
|
|
v = 1.0 - acos(vin.z / len) / M_PI;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
v = u = 0.0;
|
|
|
|
|
|
|
|
vout = vec3(u, v, 0.0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void point_map_to_tube(vec3 vin, out vec3 vout)
|
|
|
|
{
|
|
|
|
float u, v;
|
|
|
|
v = (vin.z + 1.0) * 0.5;
|
|
|
|
float len = sqrt(vin.x * vin.x + vin.y * vin[1]);
|
|
|
|
if (len > 0.0)
|
|
|
|
u = (1.0 - (atan(vin.x / len, vin.y / len) / M_PI)) * 0.5;
|
|
|
|
else
|
|
|
|
v = u = 0.0;
|
|
|
|
|
|
|
|
vout = vec3(u, v, 0.0);
|
|
|
|
}
|
|
|
|
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
void mapping(vec3 vec, mat4 mat, vec3 minvec, vec3 maxvec, float domin, float domax, out vec3 outvec)
|
|
|
|
{
|
|
|
|
outvec = (mat * vec4(vec, 1.0)).xyz;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (domin == 1.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outvec = max(outvec, minvec);
|
2016-05-23 10:31:36 +02:00
|
|
|
if (domax == 1.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outvec = min(outvec, maxvec);
|
|
|
|
}
|
|
|
|
|
|
|
|
void camera(vec3 co, out vec3 outview, out float outdepth, out float outdist)
|
|
|
|
{
|
|
|
|
outdepth = abs(co.z);
|
|
|
|
outdist = length(co);
|
2013-11-25 02:19:14 +09:00
|
|
|
outview = normalize(co);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void math_add(float val1, float val2, out float outval)
|
|
|
|
{
|
|
|
|
outval = val1 + val2;
|
|
|
|
}
|
|
|
|
|
|
|
|
void math_subtract(float val1, float val2, out float outval)
|
|
|
|
{
|
|
|
|
outval = val1 - val2;
|
|
|
|
}
|
|
|
|
|
|
|
|
void math_multiply(float val1, float val2, out float outval)
|
|
|
|
{
|
|
|
|
outval = val1 * val2;
|
|
|
|
}
|
|
|
|
|
|
|
|
void math_divide(float val1, float val2, out float outval)
|
|
|
|
{
|
|
|
|
if (val2 == 0.0)
|
|
|
|
outval = 0.0;
|
|
|
|
else
|
|
|
|
outval = val1 / val2;
|
|
|
|
}
|
|
|
|
|
|
|
|
void math_sine(float val, out float outval)
|
|
|
|
{
|
|
|
|
outval = sin(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
void math_cosine(float val, out float outval)
|
|
|
|
{
|
|
|
|
outval = cos(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
void math_tangent(float val, out float outval)
|
|
|
|
{
|
|
|
|
outval = tan(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
void math_asin(float val, out float outval)
|
|
|
|
{
|
|
|
|
if (val <= 1.0 && val >= -1.0)
|
|
|
|
outval = asin(val);
|
|
|
|
else
|
|
|
|
outval = 0.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void math_acos(float val, out float outval)
|
|
|
|
{
|
|
|
|
if (val <= 1.0 && val >= -1.0)
|
|
|
|
outval = acos(val);
|
|
|
|
else
|
|
|
|
outval = 0.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void math_atan(float val, out float outval)
|
|
|
|
{
|
|
|
|
outval = atan(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
void math_pow(float val1, float val2, out float outval)
|
|
|
|
{
|
2012-11-06 19:58:48 +00:00
|
|
|
if (val1 >= 0.0) {
|
|
|
|
outval = compatible_pow(val1, val2);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
float val2_mod_1 = mod(abs(val2), 1.0);
|
|
|
|
|
2013-03-16 14:42:05 +00:00
|
|
|
if (val2_mod_1 > 0.999 || val2_mod_1 < 0.001)
|
2012-11-06 19:58:48 +00:00
|
|
|
outval = compatible_pow(val1, floor(val2 + 0.5));
|
|
|
|
else
|
|
|
|
outval = 0.0;
|
|
|
|
}
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void math_log(float val1, float val2, out float outval)
|
|
|
|
{
|
2016-05-23 10:31:36 +02:00
|
|
|
if (val1 > 0.0 && val2 > 0.0)
|
2016-05-26 18:46:12 +10:00
|
|
|
outval = log2(val1) / log2(val2);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
else
|
2016-05-26 18:46:12 +10:00
|
|
|
outval = 0.0;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void math_max(float val1, float val2, out float outval)
|
|
|
|
{
|
|
|
|
outval = max(val1, val2);
|
|
|
|
}
|
|
|
|
|
|
|
|
void math_min(float val1, float val2, out float outval)
|
|
|
|
{
|
|
|
|
outval = min(val1, val2);
|
|
|
|
}
|
|
|
|
|
|
|
|
void math_round(float val, out float outval)
|
|
|
|
{
|
2016-05-26 18:46:12 +10:00
|
|
|
outval = floor(val + 0.5);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void math_less_than(float val1, float val2, out float outval)
|
|
|
|
{
|
2016-05-23 10:31:36 +02:00
|
|
|
if (val1 < val2)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outval = 1.0;
|
|
|
|
else
|
|
|
|
outval = 0.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void math_greater_than(float val1, float val2, out float outval)
|
|
|
|
{
|
2016-05-23 10:31:36 +02:00
|
|
|
if (val1 > val2)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outval = 1.0;
|
|
|
|
else
|
|
|
|
outval = 0.0;
|
|
|
|
}
|
|
|
|
|
2013-05-20 14:38:47 +00:00
|
|
|
void math_modulo(float val1, float val2, out float outval)
|
|
|
|
{
|
|
|
|
if (val2 == 0.0)
|
|
|
|
outval = 0.0;
|
|
|
|
else
|
|
|
|
outval = mod(val1, val2);
|
2015-02-03 15:08:28 +01:00
|
|
|
|
|
|
|
/* change sign to match C convention, mod in GLSL will take absolute for negative numbers,
|
|
|
|
* see https://www.opengl.org/sdk/docs/man/html/mod.xhtml */
|
2017-05-09 12:31:19 +02:00
|
|
|
outval = (val1 > 0.0) ? outval : outval - val2;
|
2013-05-20 14:38:47 +00:00
|
|
|
}
|
|
|
|
|
2014-05-07 16:20:17 +02:00
|
|
|
void math_abs(float val1, out float outval)
|
|
|
|
{
|
2016-05-23 19:56:50 +10:00
|
|
|
outval = abs(val1);
|
2014-05-07 16:20:17 +02:00
|
|
|
}
|
|
|
|
|
2018-05-24 02:51:41 +02:00
|
|
|
void math_atan2(float val1, float val2, out float outval)
|
|
|
|
{
|
|
|
|
outval = atan(val1, val2);
|
|
|
|
}
|
|
|
|
|
2018-07-12 23:40:18 +02:00
|
|
|
void math_floor(float val, out float outval)
|
|
|
|
{
|
|
|
|
outval = floor(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
void math_ceil(float val, out float outval)
|
|
|
|
{
|
|
|
|
outval = ceil(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
void math_fract(float val, out float outval)
|
|
|
|
{
|
|
|
|
outval = val - floor(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
void math_sqrt(float val, out float outval)
|
|
|
|
{
|
|
|
|
if (val > 0.0)
|
|
|
|
outval = sqrt(val);
|
|
|
|
else
|
|
|
|
outval = 0.0;
|
|
|
|
}
|
|
|
|
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
void squeeze(float val, float width, float center, out float outval)
|
|
|
|
{
|
2016-05-26 18:46:12 +10:00
|
|
|
outval = 1.0 / (1.0 + pow(2.71828183, -((val - center) * width)));
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void vec_math_add(vec3 v1, vec3 v2, out vec3 outvec, out float outval)
|
|
|
|
{
|
|
|
|
outvec = v1 + v2;
|
2017-05-19 14:20:08 -04:00
|
|
|
outval = (abs(outvec[0]) + abs(outvec[1]) + abs(outvec[2])) * 0.333333;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void vec_math_sub(vec3 v1, vec3 v2, out vec3 outvec, out float outval)
|
|
|
|
{
|
|
|
|
outvec = v1 - v2;
|
2017-05-19 14:20:08 -04:00
|
|
|
outval = (abs(outvec[0]) + abs(outvec[1]) + abs(outvec[2])) * 0.333333;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void vec_math_average(vec3 v1, vec3 v2, out vec3 outvec, out float outval)
|
|
|
|
{
|
|
|
|
outvec = v1 + v2;
|
|
|
|
outval = length(outvec);
|
|
|
|
outvec = normalize(outvec);
|
|
|
|
}
|
2016-04-26 18:43:02 +10:00
|
|
|
void vec_math_mix(float strength, vec3 v1, vec3 v2, out vec3 outvec)
|
|
|
|
{
|
2016-05-26 18:46:12 +10:00
|
|
|
outvec = strength * v1 + (1 - strength) * v2;
|
2016-04-26 18:43:02 +10:00
|
|
|
}
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
|
|
|
|
void vec_math_dot(vec3 v1, vec3 v2, out vec3 outvec, out float outval)
|
|
|
|
{
|
2017-05-19 14:20:08 -04:00
|
|
|
outvec = vec3(0);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outval = dot(v1, v2);
|
|
|
|
}
|
|
|
|
|
|
|
|
void vec_math_cross(vec3 v1, vec3 v2, out vec3 outvec, out float outval)
|
|
|
|
{
|
|
|
|
outvec = cross(v1, v2);
|
|
|
|
outval = length(outvec);
|
2015-01-17 14:57:10 +01:00
|
|
|
outvec /= outval;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void vec_math_normalize(vec3 v, out vec3 outvec, out float outval)
|
|
|
|
{
|
|
|
|
outval = length(v);
|
|
|
|
outvec = normalize(v);
|
|
|
|
}
|
|
|
|
|
|
|
|
void vec_math_negate(vec3 v, out vec3 outv)
|
|
|
|
{
|
|
|
|
outv = -v;
|
|
|
|
}
|
|
|
|
|
2016-02-01 18:46:32 +03:00
|
|
|
void invert_z(vec3 v, out vec3 outv)
|
|
|
|
{
|
2016-05-23 19:56:50 +10:00
|
|
|
v.z = -v.z;
|
|
|
|
outv = v;
|
2016-02-01 18:46:32 +03:00
|
|
|
}
|
|
|
|
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
void normal(vec3 dir, vec3 nor, out vec3 outnor, out float outdot)
|
|
|
|
{
|
2011-12-28 19:42:22 +00:00
|
|
|
outnor = nor;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outdot = -dot(dir, nor);
|
|
|
|
}
|
|
|
|
|
2014-12-10 19:12:54 +05:00
|
|
|
void normal_new_shading(vec3 dir, vec3 nor, out vec3 outnor, out float outdot)
|
|
|
|
{
|
|
|
|
outnor = normalize(nor);
|
|
|
|
outdot = dot(normalize(dir), nor);
|
|
|
|
}
|
|
|
|
|
2011-09-09 11:55:38 +00:00
|
|
|
void curves_vec(float fac, vec3 vec, sampler2D curvemap, out vec3 outvec)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
{
|
2017-05-19 10:23:07 -04:00
|
|
|
outvec.x = texture(curvemap, vec2((vec.x + 1.0) * 0.5, 0.0)).x;
|
|
|
|
outvec.y = texture(curvemap, vec2((vec.y + 1.0) * 0.5, 0.0)).y;
|
|
|
|
outvec.z = texture(curvemap, vec2((vec.z + 1.0) * 0.5, 0.0)).z;
|
2009-11-09 16:00:12 +00:00
|
|
|
|
|
|
|
if (fac != 1.0)
|
2016-05-26 18:46:12 +10:00
|
|
|
outvec = (outvec * fac) + (vec * (1.0 - fac));
|
2009-11-09 16:00:12 +00:00
|
|
|
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
2011-09-09 11:55:38 +00:00
|
|
|
void curves_rgb(float fac, vec4 col, sampler2D curvemap, out vec4 outcol)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
{
|
2017-05-19 10:23:07 -04:00
|
|
|
outcol.r = texture(curvemap, vec2(texture(curvemap, vec2(col.r, 0.0)).a, 0.0)).r;
|
|
|
|
outcol.g = texture(curvemap, vec2(texture(curvemap, vec2(col.g, 0.0)).a, 0.0)).g;
|
|
|
|
outcol.b = texture(curvemap, vec2(texture(curvemap, vec2(col.b, 0.0)).a, 0.0)).b;
|
2009-11-09 16:00:12 +00:00
|
|
|
|
|
|
|
if (fac != 1.0)
|
2016-05-26 18:46:12 +10:00
|
|
|
outcol = (outcol * fac) + (col * (1.0 - fac));
|
2009-11-09 16:00:12 +00:00
|
|
|
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.a = col.a;
|
|
|
|
}
|
|
|
|
|
|
|
|
void set_value(float val, out float outval)
|
|
|
|
{
|
|
|
|
outval = val;
|
|
|
|
}
|
|
|
|
|
|
|
|
void set_rgb(vec3 col, out vec3 outcol)
|
|
|
|
{
|
|
|
|
outcol = col;
|
|
|
|
}
|
|
|
|
|
|
|
|
void set_rgba(vec4 col, out vec4 outcol)
|
|
|
|
{
|
|
|
|
outcol = col;
|
|
|
|
}
|
|
|
|
|
|
|
|
void set_value_zero(out float outval)
|
|
|
|
{
|
|
|
|
outval = 0.0;
|
|
|
|
}
|
|
|
|
|
2008-09-05 20:34:35 +00:00
|
|
|
void set_value_one(out float outval)
|
|
|
|
{
|
|
|
|
outval = 1.0;
|
|
|
|
}
|
|
|
|
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
void set_rgb_zero(out vec3 outval)
|
|
|
|
{
|
|
|
|
outval = vec3(0.0);
|
|
|
|
}
|
|
|
|
|
2013-11-12 10:59:40 +00:00
|
|
|
void set_rgb_one(out vec3 outval)
|
|
|
|
{
|
|
|
|
outval = vec3(1.0);
|
|
|
|
}
|
|
|
|
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
void set_rgba_zero(out vec4 outval)
|
|
|
|
{
|
|
|
|
outval = vec4(0.0);
|
|
|
|
}
|
|
|
|
|
2013-11-12 10:59:40 +00:00
|
|
|
void set_rgba_one(out vec4 outval)
|
|
|
|
{
|
|
|
|
outval = vec4(1.0);
|
|
|
|
}
|
|
|
|
|
2013-02-15 11:46:31 +00:00
|
|
|
void brightness_contrast(vec4 col, float brightness, float contrast, out vec4 outcol)
|
|
|
|
{
|
|
|
|
float a = 1.0 + contrast;
|
2016-05-26 18:46:12 +10:00
|
|
|
float b = brightness - contrast * 0.5;
|
2013-02-15 11:46:31 +00:00
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
outcol.r = max(a * col.r + b, 0.0);
|
|
|
|
outcol.g = max(a * col.g + b, 0.0);
|
|
|
|
outcol.b = max(a * col.b + b, 0.0);
|
2013-02-15 11:46:31 +00:00
|
|
|
outcol.a = col.a;
|
|
|
|
}
|
|
|
|
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
void mix_blend(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
|
|
|
{
|
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
|
|
|
outcol = mix(col1, col2, fac);
|
|
|
|
outcol.a = col1.a;
|
|
|
|
}
|
|
|
|
|
|
|
|
void mix_add(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
|
|
|
{
|
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
|
|
|
outcol = mix(col1, col1 + col2, fac);
|
|
|
|
outcol.a = col1.a;
|
|
|
|
}
|
|
|
|
|
|
|
|
void mix_mult(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
|
|
|
{
|
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
|
|
|
outcol = mix(col1, col1 * col2, fac);
|
|
|
|
outcol.a = col1.a;
|
|
|
|
}
|
|
|
|
|
|
|
|
void mix_screen(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
|
|
|
{
|
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
|
|
|
float facm = 1.0 - fac;
|
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
outcol = vec4(1.0) - (vec4(facm) + fac * (vec4(1.0) - col2)) * (vec4(1.0) - col1);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.a = col1.a;
|
|
|
|
}
|
|
|
|
|
|
|
|
void mix_overlay(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
|
|
|
{
|
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
|
|
|
float facm = 1.0 - fac;
|
|
|
|
|
|
|
|
outcol = col1;
|
|
|
|
|
2016-05-23 10:31:36 +02:00
|
|
|
if (outcol.r < 0.5)
|
2016-05-26 18:46:12 +10:00
|
|
|
outcol.r *= facm + 2.0 * fac * col2.r;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
else
|
2016-05-26 18:46:12 +10:00
|
|
|
outcol.r = 1.0 - (facm + 2.0 * fac * (1.0 - col2.r)) * (1.0 - outcol.r);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
|
2016-05-23 10:31:36 +02:00
|
|
|
if (outcol.g < 0.5)
|
2016-05-26 18:46:12 +10:00
|
|
|
outcol.g *= facm + 2.0 * fac * col2.g;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
else
|
2016-05-26 18:46:12 +10:00
|
|
|
outcol.g = 1.0 - (facm + 2.0 * fac * (1.0 - col2.g)) * (1.0 - outcol.g);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
|
2016-05-23 10:31:36 +02:00
|
|
|
if (outcol.b < 0.5)
|
2016-05-26 18:46:12 +10:00
|
|
|
outcol.b *= facm + 2.0 * fac * col2.b;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
else
|
2016-05-26 18:46:12 +10:00
|
|
|
outcol.b = 1.0 - (facm + 2.0 * fac * (1.0 - col2.b)) * (1.0 - outcol.b);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void mix_sub(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
|
|
|
{
|
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
|
|
|
outcol = mix(col1, col1 - col2, fac);
|
|
|
|
outcol.a = col1.a;
|
|
|
|
}
|
|
|
|
|
|
|
|
void mix_div(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
|
|
|
{
|
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
|
|
|
float facm = 1.0 - fac;
|
|
|
|
|
|
|
|
outcol = col1;
|
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
if (col2.r != 0.0) outcol.r = facm * outcol.r + fac * outcol.r / col2.r;
|
|
|
|
if (col2.g != 0.0) outcol.g = facm * outcol.g + fac * outcol.g / col2.g;
|
|
|
|
if (col2.b != 0.0) outcol.b = facm * outcol.b + fac * outcol.b / col2.b;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void mix_diff(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
|
|
|
{
|
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
|
|
|
outcol = mix(col1, abs(col1 - col2), fac);
|
|
|
|
outcol.a = col1.a;
|
|
|
|
}
|
|
|
|
|
|
|
|
void mix_dark(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
|
|
|
{
|
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
2016-05-26 18:46:12 +10:00
|
|
|
outcol.rgb = min(col1.rgb, col2.rgb * fac);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.a = col1.a;
|
|
|
|
}
|
|
|
|
|
|
|
|
void mix_light(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
|
|
|
{
|
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
2016-05-26 18:46:12 +10:00
|
|
|
outcol.rgb = max(col1.rgb, col2.rgb * fac);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.a = col1.a;
|
|
|
|
}
|
|
|
|
|
|
|
|
void mix_dodge(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
|
|
|
{
|
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
|
|
|
outcol = col1;
|
|
|
|
|
2016-05-23 10:31:36 +02:00
|
|
|
if (outcol.r != 0.0) {
|
2016-05-26 18:46:12 +10:00
|
|
|
float tmp = 1.0 - fac * col2.r;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (tmp <= 0.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.r = 1.0;
|
2016-05-26 18:46:12 +10:00
|
|
|
else if ((tmp = outcol.r / tmp) > 1.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.r = 1.0;
|
|
|
|
else
|
|
|
|
outcol.r = tmp;
|
|
|
|
}
|
2016-05-23 10:31:36 +02:00
|
|
|
if (outcol.g != 0.0) {
|
2016-05-26 18:46:12 +10:00
|
|
|
float tmp = 1.0 - fac * col2.g;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (tmp <= 0.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.g = 1.0;
|
2016-05-26 18:46:12 +10:00
|
|
|
else if ((tmp = outcol.g / tmp) > 1.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.g = 1.0;
|
|
|
|
else
|
|
|
|
outcol.g = tmp;
|
|
|
|
}
|
2016-05-23 10:31:36 +02:00
|
|
|
if (outcol.b != 0.0) {
|
2016-05-26 18:46:12 +10:00
|
|
|
float tmp = 1.0 - fac * col2.b;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (tmp <= 0.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.b = 1.0;
|
2016-05-26 18:46:12 +10:00
|
|
|
else if ((tmp = outcol.b / tmp) > 1.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.b = 1.0;
|
|
|
|
else
|
|
|
|
outcol.b = tmp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void mix_burn(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
|
|
|
{
|
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
|
|
|
float tmp, facm = 1.0 - fac;
|
|
|
|
|
|
|
|
outcol = col1;
|
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
tmp = facm + fac * col2.r;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (tmp <= 0.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.r = 0.0;
|
2016-05-26 18:46:12 +10:00
|
|
|
else if ((tmp = (1.0 - (1.0 - outcol.r) / tmp)) < 0.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.r = 0.0;
|
2016-05-23 10:31:36 +02:00
|
|
|
else if (tmp > 1.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.r = 1.0;
|
|
|
|
else
|
|
|
|
outcol.r = tmp;
|
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
tmp = facm + fac * col2.g;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (tmp <= 0.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.g = 0.0;
|
2016-05-26 18:46:12 +10:00
|
|
|
else if ((tmp = (1.0 - (1.0 - outcol.g) / tmp)) < 0.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.g = 0.0;
|
2016-05-23 10:31:36 +02:00
|
|
|
else if (tmp > 1.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.g = 1.0;
|
|
|
|
else
|
|
|
|
outcol.g = tmp;
|
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
tmp = facm + fac * col2.b;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (tmp <= 0.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.b = 0.0;
|
2016-05-26 18:46:12 +10:00
|
|
|
else if ((tmp = (1.0 - (1.0 - outcol.b) / tmp)) < 0.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.b = 0.0;
|
2016-05-23 10:31:36 +02:00
|
|
|
else if (tmp > 1.0)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
outcol.b = 1.0;
|
|
|
|
else
|
|
|
|
outcol.b = tmp;
|
|
|
|
}
|
|
|
|
|
|
|
|
void mix_hue(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
|
|
|
{
|
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
|
|
|
float facm = 1.0 - fac;
|
|
|
|
|
|
|
|
outcol = col1;
|
|
|
|
|
|
|
|
vec4 hsv, hsv2, tmp;
|
|
|
|
rgb_to_hsv(col2, hsv2);
|
|
|
|
|
2016-05-23 10:31:36 +02:00
|
|
|
if (hsv2.y != 0.0) {
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
rgb_to_hsv(outcol, hsv);
|
|
|
|
hsv.x = hsv2.x;
|
2016-05-26 18:46:12 +10:00
|
|
|
hsv_to_rgb(hsv, tmp);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
|
|
|
|
outcol = mix(outcol, tmp, fac);
|
|
|
|
outcol.a = col1.a;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void mix_sat(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
|
|
|
{
|
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
|
|
|
float facm = 1.0 - fac;
|
|
|
|
|
|
|
|
outcol = col1;
|
|
|
|
|
|
|
|
vec4 hsv, hsv2;
|
|
|
|
rgb_to_hsv(outcol, hsv);
|
|
|
|
|
2016-05-23 10:31:36 +02:00
|
|
|
if (hsv.y != 0.0) {
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
rgb_to_hsv(col2, hsv2);
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
hsv.y = facm * hsv.y + fac * hsv2.y;
|
|
|
|
hsv_to_rgb(hsv, outcol);
|
2014-11-09 15:22:44 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void mix_val(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
|
|
|
float facm = 1.0 - fac;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
vec4 hsv, hsv2;
|
|
|
|
rgb_to_hsv(col1, hsv);
|
|
|
|
rgb_to_hsv(col2, hsv2);
|
2011-05-02 14:01:45 +00:00
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
hsv.z = facm * hsv.z + fac * hsv2.z;
|
|
|
|
hsv_to_rgb(hsv, outcol);
|
2011-05-02 14:01:45 +00:00
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void mix_color(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
2011-05-02 14:01:45 +00:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
|
|
|
float facm = 1.0 - fac;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
outcol = col1;
|
Environment lighting for the GLSL mode
Environment lighting (aka ambient) is a key component of any renderer.
It's implemented like the Environment lighting of BI render for Approximate Gather mode. It support "Sky Color" and "White" Environment lighting modes.
It would be great if the user could see actual lighting conditions right in the Blender viewport instead of waiting for the renderer to complete the final image, exporting for external renderer or for a game engine.
Before:
{F113921}
After:
{F113922}
Example file: {F319013}
Original author: valentin_b4w
Alexander (Blend4Web Team)
Reviewers: valentin_b4w, campbellbarton, merwin, brecht
Reviewed By: brecht
Subscribers: panzergame, youle, duarteframos, AlexKowel, yurikovelenov, dingto, Evgeny_Rodygin
Projects: #rendering, #opengl_gfx
Differential Revision: https://developer.blender.org/D810
2016-07-04 11:01:32 +03:00
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
vec4 hsv, hsv2, tmp;
|
|
|
|
rgb_to_hsv(col2, hsv2);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
if (hsv2.y != 0.0) {
|
|
|
|
rgb_to_hsv(outcol, hsv);
|
|
|
|
hsv.x = hsv2.x;
|
|
|
|
hsv.y = hsv2.y;
|
|
|
|
hsv_to_rgb(hsv, tmp);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
outcol = mix(outcol, tmp, fac);
|
|
|
|
outcol.a = col1.a;
|
|
|
|
}
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void mix_soft(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
2014-10-07 11:06:38 +02:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
|
|
|
float facm = 1.0 - fac;
|
2014-10-07 11:06:38 +02:00
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
vec4 one = vec4(1.0);
|
|
|
|
vec4 scr = one - (one - col2) * (one - col1);
|
|
|
|
outcol = facm * col1 + fac * ((one - col1) * col2 * col1 + col1 * scr);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void mix_linear(float fac, vec4 col1, vec4 col2, out vec4 outcol)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
fac = clamp(fac, 0.0, 1.0);
|
|
|
|
|
|
|
|
outcol = col1 + fac * (2.0 * (col2 - vec4(0.5)));
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void valtorgb(float fac, sampler2D colormap, out vec4 outcol, out float outalpha)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
outcol = texture(colormap, vec2(fac, 0.0));
|
|
|
|
outalpha = outcol.a;
|
2008-09-05 15:08:01 +00:00
|
|
|
}
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void rgbtobw(vec4 color, out float outval)
|
2008-09-05 15:08:01 +00:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
vec3 factors = vec3(0.2126, 0.7152, 0.0722);
|
|
|
|
outval = dot(color.rgb, factors);
|
2008-09-05 15:08:01 +00:00
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void invert(float fac, vec4 col, out vec4 outcol)
|
2008-09-05 15:08:01 +00:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
outcol.xyz = mix(col.xyz, vec3(1.0) - col.xyz, fac);
|
|
|
|
outcol.w = col.w;
|
2014-05-30 16:57:15 +09:00
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void clamp_vec3(vec3 vec, vec3 min, vec3 max, out vec3 out_vec)
|
2014-05-30 16:57:15 +09:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
out_vec = clamp(vec, min, max);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void clamp_val(float value, float min, float max, out float out_value)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
out_value = clamp(value, min, max);
|
2012-05-01 02:50:17 +00:00
|
|
|
}
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void hue_sat(float hue, float sat, float value, float fac, vec4 col, out vec4 outcol)
|
2012-05-01 02:50:17 +00:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
vec4 hsv;
|
2012-05-01 02:50:17 +00:00
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
rgb_to_hsv(col, hsv);
|
2012-05-01 02:50:17 +00:00
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
hsv[0] += (hue - 0.5);
|
|
|
|
if (hsv[0] > 1.0) hsv[0] -= 1.0; else if (hsv[0] < 0.0) hsv[0] += 1.0;
|
|
|
|
hsv[1] *= sat;
|
|
|
|
if (hsv[1] > 1.0) hsv[1] = 1.0; else if (hsv[1] < 0.0) hsv[1] = 0.0;
|
|
|
|
hsv[2] *= value;
|
|
|
|
if (hsv[2] > 1.0) hsv[2] = 1.0; else if (hsv[2] < 0.0) hsv[2] = 0.0;
|
2012-05-01 02:50:17 +00:00
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
hsv_to_rgb(hsv, outcol);
|
2012-05-01 02:50:17 +00:00
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
outcol = mix(col, outcol, fac);
|
2012-05-01 02:50:17 +00:00
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void separate_rgb(vec4 col, out float r, out float g, out float b)
|
2013-11-25 20:58:23 +09:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
r = col.r;
|
|
|
|
g = col.g;
|
|
|
|
b = col.b;
|
2013-11-25 20:58:23 +09:00
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void combine_rgb(float r, float g, float b, out vec4 col)
|
2013-11-25 20:58:23 +09:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
col = vec4(r, g, b, 1.0);
|
2013-11-25 20:58:23 +09:00
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void separate_xyz(vec3 vec, out float x, out float y, out float z)
|
2012-05-01 02:50:17 +00:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
x = vec.r;
|
|
|
|
y = vec.g;
|
|
|
|
z = vec.b;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void combine_xyz(float x, float y, float z, out vec3 vec)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
vec = vec3(x, y, z);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void separate_hsv(vec4 col, out float h, out float s, out float v)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
vec4 hsv;
|
2016-05-26 18:46:12 +10:00
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
rgb_to_hsv(col, hsv);
|
|
|
|
h = hsv[0];
|
|
|
|
s = hsv[1];
|
|
|
|
v = hsv[2];
|
|
|
|
}
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void combine_hsv(float h, float s, float v, out vec4 col)
|
|
|
|
{
|
|
|
|
hsv_to_rgb(vec4(h, s, v, 1.0), col);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
void output_node(vec4 rgb, float alpha, out vec4 outrgb)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
outrgb = vec4(rgb.rgb, alpha);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
/*********** TEXTURES ***************/
|
|
|
|
|
|
|
|
void texco_norm(vec3 normal, out vec3 outnormal)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
/* corresponds to shi->orn, which is negated so cancels
|
|
|
|
out blender normal negation */
|
|
|
|
outnormal = normalize(normal);
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
2018-04-19 19:35:36 +02:00
|
|
|
vec3 mtex_2d_mapping(vec3 vec)
|
|
|
|
{
|
|
|
|
return vec3(vec.xy * 0.5 + vec2(0.5), vec.z);
|
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
/** helper method to extract the upper left 3x3 matrix from a 4x4 matrix */
|
|
|
|
mat3 to_mat3(mat4 m4)
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
mat3 m3;
|
|
|
|
m3[0] = m4[0].xyz;
|
|
|
|
m3[1] = m4[1].xyz;
|
|
|
|
m3[2] = m4[2].xyz;
|
|
|
|
return m3;
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 20:51:28 +00:00
|
|
|
}
|
|
|
|
|
2011-11-08 11:38:16 +00:00
|
|
|
/*********** NEW SHADER UTILITIES **************/
|
|
|
|
|
2017-04-18 11:43:09 +02:00
|
|
|
float fresnel_dielectric_0(float eta)
|
|
|
|
{
|
|
|
|
/* compute fresnel reflactance at normal incidence => cosi = 1.0 */
|
|
|
|
float A = (eta - 1.0) / (eta + 1.0);
|
|
|
|
|
|
|
|
return A * A;
|
|
|
|
}
|
|
|
|
|
|
|
|
float fresnel_dielectric_cos(float cosi, float eta)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2012-06-05 22:12:17 +00:00
|
|
|
/* compute fresnel reflectance without explicitly computing
|
|
|
|
* the refracted direction */
|
2017-04-18 11:43:09 +02:00
|
|
|
float c = abs(cosi);
|
2012-06-05 22:12:17 +00:00
|
|
|
float g = eta * eta - 1.0 + c * c;
|
|
|
|
float result;
|
|
|
|
|
2016-05-23 10:31:36 +02:00
|
|
|
if (g > 0.0) {
|
2012-06-05 22:12:17 +00:00
|
|
|
g = sqrt(g);
|
2016-05-26 18:46:12 +10:00
|
|
|
float A = (g - c) / (g + c);
|
|
|
|
float B = (c * (g + c) - 1.0) / (c * (g - c) + 1.0);
|
|
|
|
result = 0.5 * A * A * (1.0 + B * B);
|
2012-06-05 22:12:17 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
result = 1.0; /* TIR (no refracted component) */
|
|
|
|
}
|
2011-11-08 11:38:16 +00:00
|
|
|
|
2012-06-05 22:12:17 +00:00
|
|
|
return result;
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2017-04-18 11:43:09 +02:00
|
|
|
float fresnel_dielectric(vec3 Incoming, vec3 Normal, float eta)
|
|
|
|
{
|
|
|
|
/* compute fresnel reflectance without explicitly computing
|
|
|
|
* the refracted direction */
|
|
|
|
return fresnel_dielectric_cos(dot(Incoming, Normal), eta);
|
|
|
|
}
|
|
|
|
|
2011-11-08 11:38:16 +00:00
|
|
|
float hypot(float x, float y)
|
|
|
|
{
|
2016-05-26 18:46:12 +10:00
|
|
|
return sqrt(x * x + y * y);
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2016-05-20 15:18:40 +02:00
|
|
|
void generated_from_orco(vec3 orco, out vec3 generated)
|
|
|
|
{
|
2017-07-04 18:02:13 +02:00
|
|
|
#ifdef VOLUMETRICS
|
2017-10-27 16:20:33 +02:00
|
|
|
#ifdef MESH_SHADER
|
|
|
|
generated = volumeObjectLocalCoord;
|
|
|
|
#else
|
2017-07-04 18:02:13 +02:00
|
|
|
generated = worldPosition;
|
2017-10-27 16:20:33 +02:00
|
|
|
#endif
|
2017-07-04 18:02:13 +02:00
|
|
|
#else
|
2017-08-25 14:16:47 +02:00
|
|
|
generated = orco;
|
2017-07-04 18:02:13 +02:00
|
|
|
#endif
|
2016-05-20 15:18:40 +02:00
|
|
|
}
|
|
|
|
|
2016-05-30 10:17:55 +02:00
|
|
|
int floor_to_int(float x)
|
|
|
|
{
|
|
|
|
return int(floor(x));
|
|
|
|
}
|
2016-05-30 13:07:11 +02:00
|
|
|
|
|
|
|
int quick_floor(float x)
|
|
|
|
{
|
|
|
|
return int(x) - ((x < 0) ? 1 : 0);
|
|
|
|
}
|
|
|
|
|
2016-05-20 16:13:44 +02:00
|
|
|
float integer_noise(int n)
|
|
|
|
{
|
|
|
|
int nn;
|
|
|
|
n = (n + 1013) & 0x7fffffff;
|
|
|
|
n = (n >> 13) ^ n;
|
|
|
|
nn = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff;
|
2016-05-20 18:14:04 +02:00
|
|
|
return 0.5 * (float(nn) / 1073741824.0);
|
2016-05-20 16:13:44 +02:00
|
|
|
}
|
|
|
|
|
2016-05-20 18:05:29 +02:00
|
|
|
uint hash(uint kx, uint ky, uint kz)
|
|
|
|
{
|
2016-05-26 18:46:12 +10:00
|
|
|
#define rot(x, k) (((x) << (k)) | ((x) >> (32 - (k))))
|
|
|
|
#define final(a, b, c) \
|
2016-05-20 18:05:29 +02:00
|
|
|
{ \
|
2016-05-26 18:46:12 +10:00
|
|
|
c ^= b; c -= rot(b, 14); \
|
|
|
|
a ^= c; a -= rot(c, 11); \
|
|
|
|
b ^= a; b -= rot(a, 25); \
|
|
|
|
c ^= b; c -= rot(b, 16); \
|
|
|
|
a ^= c; a -= rot(c, 4); \
|
|
|
|
b ^= a; b -= rot(a, 14); \
|
|
|
|
c ^= b; c -= rot(b, 24); \
|
2016-05-20 18:05:29 +02:00
|
|
|
}
|
|
|
|
// now hash the data!
|
|
|
|
uint a, b, c, len = 3u;
|
|
|
|
a = b = c = 0xdeadbeefu + (len << 2u) + 13u;
|
|
|
|
|
|
|
|
c += kz;
|
|
|
|
b += ky;
|
|
|
|
a += kx;
|
2016-05-26 18:46:12 +10:00
|
|
|
final (a, b, c);
|
2016-05-20 18:05:29 +02:00
|
|
|
|
|
|
|
return c;
|
|
|
|
#undef rot
|
|
|
|
#undef final
|
|
|
|
}
|
|
|
|
|
2016-05-20 18:58:56 +02:00
|
|
|
uint hash(int kx, int ky, int kz)
|
|
|
|
{
|
|
|
|
return hash(uint(kx), uint(ky), uint(kz));
|
|
|
|
}
|
|
|
|
|
2016-05-20 18:05:29 +02:00
|
|
|
float bits_to_01(uint bits)
|
|
|
|
{
|
2018-01-31 22:31:08 -02:00
|
|
|
return (float(bits) / 4294967295.0);
|
2016-05-20 18:05:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
float cellnoise(vec3 p)
|
|
|
|
{
|
2016-05-30 13:07:11 +02:00
|
|
|
int ix = quick_floor(p.x);
|
|
|
|
int iy = quick_floor(p.y);
|
|
|
|
int iz = quick_floor(p.z);
|
2016-05-20 18:05:29 +02:00
|
|
|
|
|
|
|
return bits_to_01(hash(uint(ix), uint(iy), uint(iz)));
|
|
|
|
}
|
|
|
|
|
|
|
|
vec3 cellnoise_color(vec3 p)
|
|
|
|
{
|
|
|
|
float r = cellnoise(p);
|
|
|
|
float g = cellnoise(vec3(p.y, p.x, p.z));
|
|
|
|
float b = cellnoise(vec3(p.y, p.z, p.x));
|
|
|
|
|
|
|
|
return vec3(r, g, b);
|
|
|
|
}
|
|
|
|
|
2016-05-20 18:58:56 +02:00
|
|
|
float floorfrac(float x, out int i)
|
|
|
|
{
|
|
|
|
i = floor_to_int(x);
|
|
|
|
return x - i;
|
|
|
|
}
|
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
/* bsdfs */
|
2017-04-18 11:43:09 +02:00
|
|
|
|
2017-06-30 14:12:25 +02:00
|
|
|
void convert_metallic_to_specular_tinted(
|
|
|
|
vec3 basecol, float metallic, float specular_fac, float specular_tint,
|
|
|
|
out vec3 diffuse, out vec3 f0)
|
|
|
|
{
|
|
|
|
vec3 dielectric = vec3(0.034) * specular_fac * 2.0;
|
|
|
|
float lum = dot(basecol, vec3(0.3, 0.6, 0.1)); /* luminance approx. */
|
|
|
|
vec3 tint = lum > 0 ? basecol / lum : vec3(1.0); /* normalize lum. to isolate hue+sat */
|
|
|
|
f0 = mix(dielectric * mix(vec3(1.0), tint, specular_tint), basecol, metallic);
|
|
|
|
diffuse = mix(basecol, vec3(0.0), metallic);
|
|
|
|
}
|
|
|
|
|
2017-07-03 22:08:07 +02:00
|
|
|
#ifndef VOLUMETRICS
|
2017-07-03 21:39:52 +02:00
|
|
|
void node_bsdf_diffuse(vec4 color, float roughness, vec3 N, out Closure result)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2017-07-24 15:36:22 +02:00
|
|
|
vec3 vN = normalize(mat3(ViewMatrix) * N);
|
2017-11-14 00:49:54 +01:00
|
|
|
result = CLOSURE_DEFAULT;
|
2017-11-13 21:56:49 +01:00
|
|
|
result.ssr_normal = normal_encode(vN, viewCameraVec);
|
2017-11-24 06:15:42 +01:00
|
|
|
eevee_closure_diffuse(N, color.rgb, 1.0, result.radiance);
|
|
|
|
result.radiance *= color.rgb;
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2017-07-16 23:49:25 +02:00
|
|
|
void node_bsdf_glossy(vec4 color, float roughness, vec3 N, float ssr_id, out Closure result)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2017-11-24 06:15:42 +01:00
|
|
|
vec3 out_spec, ssr_spec;
|
|
|
|
eevee_closure_glossy(N, vec3(1.0), int(ssr_id), roughness, 1.0, out_spec, ssr_spec);
|
2017-07-17 13:39:03 +02:00
|
|
|
vec3 vN = normalize(mat3(ViewMatrix) * N);
|
2017-11-14 00:49:54 +01:00
|
|
|
result = CLOSURE_DEFAULT;
|
2017-11-24 06:15:42 +01:00
|
|
|
result.radiance = out_spec * color.rgb;
|
2017-11-13 21:56:49 +01:00
|
|
|
result.ssr_data = vec4(ssr_spec * color.rgb, roughness);
|
|
|
|
result.ssr_normal = normal_encode(vN, viewCameraVec);
|
|
|
|
result.ssr_id = int(ssr_id);
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2016-05-23 19:56:50 +10:00
|
|
|
void node_bsdf_anisotropic(
|
|
|
|
vec4 color, float roughness, float anisotropy, float rotation, vec3 N, vec3 T,
|
2017-07-03 21:39:52 +02:00
|
|
|
out Closure result)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2011-11-14 17:31:47 +00:00
|
|
|
node_bsdf_diffuse(color, 0.0, N, result);
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2017-08-15 09:36:23 +02:00
|
|
|
void node_bsdf_glass(vec4 color, float roughness, float ior, vec3 N, float ssr_id, out Closure result)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2017-11-24 06:15:42 +01:00
|
|
|
vec3 out_spec, out_refr, ssr_spec;
|
|
|
|
vec3 refr_color = (refractionDepth > 0.0) ? color.rgb * color.rgb : color.rgb; /* Simulate 2 transmission event */
|
|
|
|
eevee_closure_glass(N, vec3(1.0), int(ssr_id), roughness, 1.0, ior, out_spec, out_refr, ssr_spec);
|
|
|
|
out_refr *= refr_color;
|
|
|
|
out_spec *= color.rgb;
|
|
|
|
float fresnel = F_eta(ior, dot(N, cameraVec));
|
2017-08-04 18:47:41 +02:00
|
|
|
vec3 vN = normalize(mat3(ViewMatrix) * N);
|
2017-11-14 00:49:54 +01:00
|
|
|
result = CLOSURE_DEFAULT;
|
2017-11-24 06:15:42 +01:00
|
|
|
result.radiance = mix(out_refr, out_spec, fresnel);
|
|
|
|
result.ssr_data = vec4(ssr_spec * color.rgb * fresnel, roughness);
|
2017-11-13 21:56:49 +01:00
|
|
|
result.ssr_normal = normal_encode(vN, viewCameraVec);
|
|
|
|
result.ssr_id = int(ssr_id);
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2017-07-03 21:39:52 +02:00
|
|
|
void node_bsdf_toon(vec4 color, float size, float tsmooth, vec3 N, out Closure result)
|
2013-05-23 17:45:20 +00:00
|
|
|
{
|
|
|
|
node_bsdf_diffuse(color, 0.0, N, result);
|
|
|
|
}
|
|
|
|
|
2017-06-30 14:12:25 +02:00
|
|
|
void node_bsdf_principled_clearcoat(vec4 base_color, float subsurface, vec3 subsurface_radius, vec4 subsurface_color, float metallic, float specular,
|
|
|
|
float specular_tint, float roughness, float anisotropic, float anisotropic_rotation, float sheen, float sheen_tint, float clearcoat,
|
2017-11-16 21:29:48 +01:00
|
|
|
float clearcoat_roughness, float ior, float transmission, float transmission_roughness, vec3 N, vec3 CN, vec3 T, vec3 I, float ssr_id,
|
2017-11-23 03:39:06 +01:00
|
|
|
float sss_id, vec3 sss_scale, out Closure result)
|
2017-06-30 14:12:25 +02:00
|
|
|
{
|
2017-11-24 06:15:42 +01:00
|
|
|
metallic = saturate(metallic);
|
|
|
|
transmission = saturate(transmission);
|
2017-09-05 16:33:08 +02:00
|
|
|
|
2017-11-24 06:15:42 +01:00
|
|
|
vec3 diffuse, f0, out_diff, out_spec, out_trans, out_refr, ssr_spec;
|
2017-06-30 14:12:25 +02:00
|
|
|
convert_metallic_to_specular_tinted(base_color.rgb, metallic, specular, specular_tint, diffuse, f0);
|
|
|
|
|
2017-11-24 06:15:42 +01:00
|
|
|
transmission *= 1.0 - metallic;
|
|
|
|
subsurface *= 1.0 - metallic;
|
2017-06-30 14:12:25 +02:00
|
|
|
|
2017-11-24 06:15:42 +01:00
|
|
|
clearcoat *= 0.25;
|
|
|
|
clearcoat *= 1.0 - transmission;
|
2017-11-16 21:29:48 +01:00
|
|
|
|
|
|
|
#ifdef USE_SSS
|
|
|
|
diffuse = mix(diffuse, vec3(0.0), subsurface);
|
|
|
|
#else
|
|
|
|
diffuse = mix(diffuse, subsurface_color.rgb, subsurface);
|
|
|
|
#endif
|
2017-11-24 06:15:42 +01:00
|
|
|
f0 = mix(f0, vec3(1.0), transmission);
|
|
|
|
|
|
|
|
float sss_scalef = dot(sss_scale, vec3(1.0 / 3.0));
|
|
|
|
eevee_closure_principled(N, diffuse, f0, int(ssr_id), roughness,
|
|
|
|
CN, clearcoat, clearcoat_roughness, 1.0, sss_scalef, ior,
|
|
|
|
out_diff, out_trans, out_spec, out_refr, ssr_spec);
|
|
|
|
|
|
|
|
vec3 refr_color = base_color.rgb;
|
|
|
|
refr_color *= (refractionDepth > 0.0) ? refr_color : vec3(1.0); /* Simulate 2 transmission event */
|
|
|
|
|
|
|
|
float fresnel = F_eta(ior, dot(N, cameraVec));
|
|
|
|
vec3 refr_spec_color = base_color.rgb * fresnel;
|
|
|
|
/* This bit maybe innacurate. */
|
|
|
|
out_refr = out_refr * refr_color * (1.0 - fresnel) + out_spec * refr_spec_color;
|
|
|
|
|
|
|
|
ssr_spec = mix(ssr_spec, refr_spec_color, transmission);
|
2017-11-16 21:29:48 +01:00
|
|
|
|
2017-07-17 13:39:03 +02:00
|
|
|
vec3 vN = normalize(mat3(ViewMatrix) * N);
|
2017-11-14 00:49:54 +01:00
|
|
|
result = CLOSURE_DEFAULT;
|
2017-11-24 06:15:42 +01:00
|
|
|
result.radiance = out_spec + out_diff * diffuse;
|
|
|
|
result.radiance = mix(result.radiance, out_refr, transmission);
|
2017-11-13 21:56:49 +01:00
|
|
|
result.ssr_data = vec4(ssr_spec, roughness);
|
|
|
|
result.ssr_normal = normal_encode(vN, viewCameraVec);
|
|
|
|
result.ssr_id = int(ssr_id);
|
2017-11-16 21:29:48 +01:00
|
|
|
#ifdef USE_SSS
|
2017-11-24 06:15:42 +01:00
|
|
|
result.sss_data.a = sss_scalef;
|
2017-11-24 22:29:18 +01:00
|
|
|
result.sss_data.rgb = out_diff + out_trans;
|
|
|
|
#ifdef USE_SSS_ALBEDO
|
|
|
|
result.sss_albedo.rgb = mix(vec3(0.0), subsurface_color.rgb, subsurface);
|
|
|
|
#else
|
|
|
|
result.sss_data.rgb *= mix(vec3(0.0), subsurface_color.rgb, subsurface);
|
|
|
|
#endif
|
2017-11-24 06:15:42 +01:00
|
|
|
result.sss_data.rgb *= (1.0 - transmission);
|
2017-06-30 14:12:25 +02:00
|
|
|
#endif
|
2017-04-18 11:43:09 +02:00
|
|
|
}
|
|
|
|
|
2017-07-03 21:39:52 +02:00
|
|
|
void node_bsdf_translucent(vec4 color, vec3 N, out Closure result)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2017-08-04 18:47:41 +02:00
|
|
|
node_bsdf_diffuse(color, 0.0, -N, result);
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2017-07-03 21:39:52 +02:00
|
|
|
void node_bsdf_transparent(vec4 color, out Closure result)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
|
|
|
/* this isn't right */
|
2017-11-14 00:49:54 +01:00
|
|
|
result = CLOSURE_DEFAULT;
|
2017-09-12 14:19:57 +02:00
|
|
|
result.radiance = vec3(0.0);
|
|
|
|
result.opacity = 0.0;
|
2017-09-26 16:47:53 +02:00
|
|
|
result.ssr_id = TRANSPARENT_CLOSURE_FLAG;
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2017-07-03 21:39:52 +02:00
|
|
|
void node_bsdf_velvet(vec4 color, float sigma, vec3 N, out Closure result)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2011-11-14 17:31:47 +00:00
|
|
|
node_bsdf_diffuse(color, 0.0, N, result);
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2016-05-23 19:56:50 +10:00
|
|
|
void node_subsurface_scattering(
|
2017-11-13 21:56:49 +01:00
|
|
|
vec4 color, float scale, vec3 radius, float sharpen, float texture_blur, vec3 N, float sss_id,
|
2017-07-03 21:39:52 +02:00
|
|
|
out Closure result)
|
2013-04-01 20:26:52 +00:00
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
#if defined(USE_SSS)
|
2017-11-24 06:15:42 +01:00
|
|
|
vec3 out_diff, out_trans;
|
2017-11-13 21:56:49 +01:00
|
|
|
vec3 vN = normalize(mat3(ViewMatrix) * N);
|
2017-11-14 00:49:54 +01:00
|
|
|
result = CLOSURE_DEFAULT;
|
2017-11-13 21:56:49 +01:00
|
|
|
result.ssr_data = vec4(0.0);
|
|
|
|
result.ssr_normal = normal_encode(vN, viewCameraVec);
|
|
|
|
result.ssr_id = -1;
|
|
|
|
result.sss_data.a = scale;
|
2017-11-24 06:15:42 +01:00
|
|
|
eevee_closure_subsurface(N, color.rgb, 1.0, scale, out_diff, out_trans);
|
2017-11-24 22:29:18 +01:00
|
|
|
result.sss_data.rgb = out_diff + out_trans;
|
|
|
|
#ifdef USE_SSS_ALBEDO
|
|
|
|
/* Not perfect for texture_blur not exaclty equal to 0.0 or 1.0. */
|
|
|
|
result.sss_albedo.rgb = mix(color.rgb, vec3(1.0), texture_blur);
|
|
|
|
result.sss_data.rgb *= mix(vec3(1.0), color.rgb, texture_blur);
|
|
|
|
#else
|
|
|
|
result.sss_data.rgb *= color.rgb;
|
|
|
|
#endif
|
2018-04-19 19:35:36 +02:00
|
|
|
#else
|
|
|
|
node_bsdf_diffuse(color, 0.0, N, result);
|
|
|
|
#endif
|
2013-04-01 20:26:52 +00:00
|
|
|
}
|
|
|
|
|
2017-08-04 18:47:41 +02:00
|
|
|
void node_bsdf_refraction(vec4 color, float roughness, float ior, vec3 N, out Closure result)
|
|
|
|
{
|
2017-11-24 06:15:42 +01:00
|
|
|
vec3 out_refr;
|
2017-08-10 15:43:15 +02:00
|
|
|
color.rgb *= (refractionDepth > 0.0) ? color.rgb : vec3(1.0); /* Simulate 2 absorption event. */
|
2017-11-24 06:15:42 +01:00
|
|
|
eevee_closure_refraction(N, roughness, ior, out_refr);
|
2018-01-31 22:53:29 +01:00
|
|
|
vec3 vN = normalize(mat3(ViewMatrix) * N);
|
2017-11-14 00:49:54 +01:00
|
|
|
result = CLOSURE_DEFAULT;
|
2018-01-31 22:53:29 +01:00
|
|
|
result.ssr_normal = normal_encode(vN, viewCameraVec);
|
2017-11-24 06:15:42 +01:00
|
|
|
result.radiance = out_refr * color.rgb;
|
2017-11-13 21:56:49 +01:00
|
|
|
result.ssr_id = REFRACT_CLOSURE_FLAG;
|
2015-07-28 15:56:34 +02:00
|
|
|
}
|
2017-07-16 23:49:25 +02:00
|
|
|
|
2018-06-15 23:04:35 +02:00
|
|
|
void node_ambient_occlusion(vec4 color, float distance, vec3 normal, out vec4 result_color, out float result_ao)
|
2018-05-15 17:30:52 +02:00
|
|
|
{
|
|
|
|
vec3 bent_normal;
|
|
|
|
vec4 rand = texelFetch(utilTex, ivec3(ivec2(gl_FragCoord.xy) % LUT_SIZE, 2.0), 0);
|
2018-06-15 23:04:35 +02:00
|
|
|
result_ao = occlusion_compute(normalize(normal), viewPosition, 1.0, rand, bent_normal);
|
|
|
|
result_color = result_ao * color;
|
2018-05-15 17:30:52 +02:00
|
|
|
}
|
|
|
|
|
2017-07-03 22:08:07 +02:00
|
|
|
#endif /* VOLUMETRICS */
|
2015-07-28 15:56:34 +02:00
|
|
|
|
2011-11-08 11:38:16 +00:00
|
|
|
/* emission */
|
|
|
|
|
2018-02-02 23:59:22 +01:00
|
|
|
void node_emission(vec4 color, float strength, vec3 vN, out Closure result)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2017-07-03 22:08:07 +02:00
|
|
|
#ifndef VOLUMETRICS
|
2017-07-03 21:39:52 +02:00
|
|
|
color *= strength;
|
2017-11-14 00:49:54 +01:00
|
|
|
result = CLOSURE_DEFAULT;
|
2017-11-13 21:56:49 +01:00
|
|
|
result.radiance = color.rgb;
|
|
|
|
result.opacity = color.a;
|
2018-01-31 01:08:24 +01:00
|
|
|
result.ssr_normal = normal_encode(vN, viewCameraVec);
|
2017-07-03 22:08:07 +02:00
|
|
|
#else
|
|
|
|
result = Closure(vec3(0.0), vec3(0.0), color.rgb * strength, 0.0);
|
|
|
|
#endif
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2014-11-24 17:18:56 +01:00
|
|
|
/* background */
|
|
|
|
|
|
|
|
void background_transform_to_world(vec3 viewvec, out vec3 worldvec)
|
|
|
|
{
|
2017-03-26 21:19:23 -04:00
|
|
|
vec4 v = (ProjectionMatrix[3][3] == 0.0) ? vec4(viewvec, 1.0) : vec4(0.0, 0.0, 1.0, 1.0);
|
|
|
|
vec4 co_homogenous = (ProjectionMatrixInverse * v);
|
2014-11-24 17:18:56 +01:00
|
|
|
|
|
|
|
vec4 co = vec4(co_homogenous.xyz / co_homogenous.w, 0.0);
|
2017-06-29 20:22:52 +02:00
|
|
|
#if defined(WORLD_BACKGROUND) || defined(PROBE_CAPTURE)
|
2017-05-07 15:22:25 +02:00
|
|
|
worldvec = (ViewMatrixInverse * co).xyz;
|
|
|
|
#else
|
2017-03-26 21:19:23 -04:00
|
|
|
worldvec = (ModelViewMatrixInverse * co).xyz;
|
2017-05-07 15:22:25 +02:00
|
|
|
#endif
|
2014-11-24 17:18:56 +01:00
|
|
|
}
|
|
|
|
|
2017-07-03 21:39:52 +02:00
|
|
|
void node_background(vec4 color, float strength, out Closure result)
|
2014-11-24 17:18:56 +01:00
|
|
|
{
|
2017-07-03 22:08:07 +02:00
|
|
|
#ifndef VOLUMETRICS
|
2017-07-03 21:39:52 +02:00
|
|
|
color *= strength;
|
2017-11-14 00:49:54 +01:00
|
|
|
result = CLOSURE_DEFAULT;
|
2017-11-13 21:56:49 +01:00
|
|
|
result.radiance = color.rgb;
|
|
|
|
result.opacity = color.a;
|
2017-07-03 22:08:07 +02:00
|
|
|
#else
|
|
|
|
result = CLOSURE_DEFAULT;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/* volumes */
|
|
|
|
|
|
|
|
void node_volume_scatter(vec4 color, float density, float anisotropy, out Closure result)
|
|
|
|
{
|
|
|
|
#ifdef VOLUMETRICS
|
|
|
|
result = Closure(vec3(0.0), color.rgb * density, vec3(0.0), anisotropy);
|
|
|
|
#else
|
|
|
|
result = CLOSURE_DEFAULT;
|
|
|
|
#endif
|
2014-11-24 17:18:56 +01:00
|
|
|
}
|
|
|
|
|
2017-07-04 15:29:18 +02:00
|
|
|
void node_volume_absorption(vec4 color, float density, out Closure result)
|
|
|
|
{
|
|
|
|
#ifdef VOLUMETRICS
|
|
|
|
result = Closure((1.0 - color.rgb) * density, vec3(0.0), vec3(0.0), 0.0);
|
|
|
|
#else
|
|
|
|
result = CLOSURE_DEFAULT;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2018-02-23 04:55:54 +01:00
|
|
|
void node_blackbody(float temperature, sampler2D spectrummap, out vec4 color)
|
|
|
|
{
|
|
|
|
if(temperature >= 12000.0) {
|
|
|
|
color = vec4(0.826270103, 0.994478524, 1.56626022, 1.0);
|
|
|
|
}
|
|
|
|
else if(temperature < 965.0) {
|
|
|
|
color = vec4(4.70366907, 0.0, 0.0, 1.0);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
float t = (temperature - 965.0) / (12000.0 - 965.0);
|
|
|
|
color = vec4(texture(spectrummap, vec2(t, 0.0)).rgb, 1.0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-22 20:04:20 +01:00
|
|
|
void node_volume_principled(
|
|
|
|
vec4 color,
|
|
|
|
float density,
|
|
|
|
float anisotropy,
|
|
|
|
vec4 absorption_color,
|
|
|
|
float emission_strength,
|
|
|
|
vec4 emission_color,
|
|
|
|
float blackbody_intensity,
|
|
|
|
vec4 blackbody_tint,
|
|
|
|
float temperature,
|
|
|
|
float density_attribute,
|
|
|
|
vec4 color_attribute,
|
|
|
|
float temperature_attribute,
|
|
|
|
sampler2D spectrummap,
|
|
|
|
out Closure result)
|
|
|
|
{
|
|
|
|
#ifdef VOLUMETRICS
|
|
|
|
vec3 absorption_coeff = vec3(0.0);
|
|
|
|
vec3 scatter_coeff = vec3(0.0);
|
|
|
|
vec3 emission_coeff = vec3(0.0);
|
|
|
|
|
|
|
|
/* Compute density. */
|
|
|
|
density = max(density, 0.0);
|
|
|
|
|
|
|
|
if(density > 1e-5) {
|
|
|
|
density = max(density * density_attribute, 0.0);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(density > 1e-5) {
|
|
|
|
/* Compute scattering and absorption coefficients. */
|
|
|
|
vec3 scatter_color = color.rgb * color_attribute.rgb;
|
|
|
|
|
|
|
|
scatter_coeff = scatter_color * density;
|
2018-02-28 21:33:40 +01:00
|
|
|
absorption_color.rgb = sqrt(max(absorption_color.rgb, 0.0));
|
2018-02-22 20:04:20 +01:00
|
|
|
absorption_coeff = max(1.0 - scatter_color, 0.0) * max(1.0 - absorption_color.rgb, 0.0) * density;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Compute emission. */
|
|
|
|
emission_strength = max(emission_strength, 0.0);
|
|
|
|
|
|
|
|
if(emission_strength > 1e-5) {
|
|
|
|
emission_coeff += emission_strength * emission_color.rgb;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(blackbody_intensity > 1e-3) {
|
|
|
|
/* Add temperature from attribute. */
|
|
|
|
float T = max(temperature * max(temperature_attribute, 0.0), 0.0);
|
|
|
|
|
|
|
|
/* Stefan-Boltzman law. */
|
|
|
|
float T4 = (T * T) * (T * T);
|
|
|
|
float sigma = 5.670373e-8 * 1e-6 / M_PI;
|
|
|
|
float intensity = sigma * mix(1.0, T4, blackbody_intensity);
|
|
|
|
|
|
|
|
if(intensity > 1e-5) {
|
|
|
|
vec4 bb;
|
|
|
|
node_blackbody(T, spectrummap, bb);
|
|
|
|
emission_coeff += bb.rgb * blackbody_tint.rgb * intensity;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
result = Closure(absorption_coeff, scatter_coeff, emission_coeff, anisotropy);
|
|
|
|
#else
|
|
|
|
result = CLOSURE_DEFAULT;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2011-11-08 11:38:16 +00:00
|
|
|
/* closures */
|
|
|
|
|
2017-07-03 21:39:52 +02:00
|
|
|
void node_mix_shader(float fac, Closure shader1, Closure shader2, out Closure shader)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2017-07-03 21:39:52 +02:00
|
|
|
shader = closure_mix(shader1, shader2, fac);
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2017-07-03 21:39:52 +02:00
|
|
|
void node_add_shader(Closure shader1, Closure shader2, out Closure shader)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2017-07-03 21:39:52 +02:00
|
|
|
shader = closure_add(shader1, shader2);
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* fresnel */
|
|
|
|
|
2016-03-05 14:29:32 +01:00
|
|
|
void node_fresnel(float ior, vec3 N, vec3 I, out float result)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2014-06-04 19:35:56 +02:00
|
|
|
/* handle perspective/orthographic */
|
2017-03-26 21:19:23 -04:00
|
|
|
vec3 I_view = (ProjectionMatrix[3][3] == 0.0) ? normalize(I) : vec3(0.0, 0.0, -1.0);
|
2014-06-04 19:35:56 +02:00
|
|
|
|
2011-11-08 11:38:16 +00:00
|
|
|
float eta = max(ior, 0.00001);
|
2016-05-26 18:46:12 +10:00
|
|
|
result = fresnel_dielectric(I_view, N, (gl_FrontFacing) ? eta : 1.0 / eta);
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2013-11-22 00:33:28 +01:00
|
|
|
/* layer_weight */
|
|
|
|
|
2016-03-05 14:29:32 +01:00
|
|
|
void node_layer_weight(float blend, vec3 N, vec3 I, out float fresnel, out float facing)
|
2013-11-22 00:33:28 +01:00
|
|
|
{
|
|
|
|
/* fresnel */
|
|
|
|
float eta = max(1.0 - blend, 0.00001);
|
2017-03-26 21:19:23 -04:00
|
|
|
vec3 I_view = (ProjectionMatrix[3][3] == 0.0) ? normalize(I) : vec3(0.0, 0.0, -1.0);
|
2014-11-06 15:03:34 +01:00
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
fresnel = fresnel_dielectric(I_view, N, (gl_FrontFacing) ? 1.0 / eta : eta);
|
2013-11-22 00:33:28 +01:00
|
|
|
|
|
|
|
/* facing */
|
2016-03-05 14:29:32 +01:00
|
|
|
facing = abs(dot(I_view, N));
|
2016-05-23 10:31:36 +02:00
|
|
|
if (blend != 0.5) {
|
2013-11-22 00:33:28 +01:00
|
|
|
blend = clamp(blend, 0.0, 0.99999);
|
2016-05-26 18:46:12 +10:00
|
|
|
blend = (blend < 0.5) ? 2.0 * blend : 0.5 / (1.0 - blend);
|
2013-11-22 00:33:28 +01:00
|
|
|
facing = pow(facing, blend);
|
|
|
|
}
|
|
|
|
facing = 1.0 - facing;
|
|
|
|
}
|
|
|
|
|
2013-09-30 12:11:27 +00:00
|
|
|
/* gamma */
|
|
|
|
|
|
|
|
void node_gamma(vec4 col, float gamma, out vec4 outcol)
|
|
|
|
{
|
|
|
|
outcol = col;
|
|
|
|
|
2016-05-23 10:31:36 +02:00
|
|
|
if (col.r > 0.0)
|
2013-09-30 12:11:27 +00:00
|
|
|
outcol.r = compatible_pow(col.r, gamma);
|
2016-05-23 10:31:36 +02:00
|
|
|
if (col.g > 0.0)
|
2013-09-30 12:11:27 +00:00
|
|
|
outcol.g = compatible_pow(col.g, gamma);
|
2016-05-23 10:31:36 +02:00
|
|
|
if (col.b > 0.0)
|
2013-09-30 12:11:27 +00:00
|
|
|
outcol.b = compatible_pow(col.b, gamma);
|
|
|
|
}
|
|
|
|
|
2011-11-08 11:38:16 +00:00
|
|
|
/* geometry */
|
|
|
|
|
2017-10-27 22:35:48 +02:00
|
|
|
void node_attribute_volume_density(sampler3D tex, out vec4 outcol, out vec3 outvec, out float outf)
|
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
#if defined(MESH_SHADER) && defined(VOLUMETRICS)
|
2017-10-27 22:35:48 +02:00
|
|
|
vec3 cos = volumeObjectLocalCoord;
|
|
|
|
#else
|
|
|
|
vec3 cos = vec3(0.0);
|
|
|
|
#endif
|
|
|
|
outvec = texture(tex, cos).aaa;
|
|
|
|
outcol = vec4(outvec, 1.0);
|
|
|
|
outf = dot(vec3(1.0 / 3.0), outvec);
|
|
|
|
}
|
|
|
|
|
|
|
|
void node_attribute_volume_color(sampler3D tex, out vec4 outcol, out vec3 outvec, out float outf)
|
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
#if defined(MESH_SHADER) && defined(VOLUMETRICS)
|
2017-10-27 22:35:48 +02:00
|
|
|
vec3 cos = volumeObjectLocalCoord;
|
|
|
|
#else
|
|
|
|
vec3 cos = vec3(0.0);
|
|
|
|
#endif
|
2018-02-22 18:51:20 +01:00
|
|
|
|
|
|
|
vec4 value = texture(tex, cos).rgba;
|
|
|
|
/* Density is premultiplied for interpolation, divide it out here. */
|
2018-03-10 06:55:39 +01:00
|
|
|
if (value.a > 1e-8)
|
2018-02-22 18:51:20 +01:00
|
|
|
value.rgb /= value.a;
|
|
|
|
|
|
|
|
outvec = value.rgb;
|
2017-10-27 22:35:48 +02:00
|
|
|
outcol = vec4(outvec, 1.0);
|
|
|
|
outf = dot(vec3(1.0 / 3.0), outvec);
|
|
|
|
}
|
|
|
|
|
|
|
|
void node_attribute_volume_flame(sampler3D tex, out vec4 outcol, out vec3 outvec, out float outf)
|
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
#if defined(MESH_SHADER) && defined(VOLUMETRICS)
|
2017-10-27 22:35:48 +02:00
|
|
|
vec3 cos = volumeObjectLocalCoord;
|
|
|
|
#else
|
|
|
|
vec3 cos = vec3(0.0);
|
|
|
|
#endif
|
2018-02-22 18:51:20 +01:00
|
|
|
outf = texture(tex, cos).r;
|
|
|
|
outvec = vec3(outf, outf, outf);
|
|
|
|
outcol = vec4(outf, outf, outf, 1.0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void node_attribute_volume_temperature(sampler3D tex, vec2 temperature, out vec4 outcol, out vec3 outvec, out float outf)
|
|
|
|
{
|
2018-04-19 18:15:55 +02:00
|
|
|
#if defined(MESH_SHADER) && defined(VOLUMETRICS)
|
2018-02-22 18:51:20 +01:00
|
|
|
vec3 cos = volumeObjectLocalCoord;
|
|
|
|
#else
|
|
|
|
vec3 cos = vec3(0.0);
|
|
|
|
#endif
|
|
|
|
float flame = texture(tex, cos).r;
|
|
|
|
|
|
|
|
outf = (flame > 0.01) ? temperature.x + flame * (temperature.y - temperature.x): 0.0;
|
|
|
|
outvec = vec3(outf, outf, outf);
|
|
|
|
outcol = vec4(outf, outf, outf, 1.0);
|
2017-10-27 22:35:48 +02:00
|
|
|
}
|
|
|
|
|
2016-05-22 18:24:53 +02:00
|
|
|
void node_attribute(vec3 attr, out vec4 outcol, out vec3 outvec, out float outf)
|
2013-06-05 15:54:39 +00:00
|
|
|
{
|
2016-05-22 18:24:53 +02:00
|
|
|
outcol = vec4(attr, 1.0);
|
|
|
|
outvec = attr;
|
2017-10-27 22:35:48 +02:00
|
|
|
outf = dot(vec3(1.0 / 3.0), attr);
|
2013-06-05 15:54:39 +00:00
|
|
|
}
|
|
|
|
|
2014-07-19 14:59:41 +02:00
|
|
|
void node_uvmap(vec3 attr_uv, out vec3 outvec)
|
|
|
|
{
|
|
|
|
outvec = attr_uv;
|
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:57 +02:00
|
|
|
void tangent_orco_x(vec3 orco_in, out vec3 orco_out)
|
|
|
|
{
|
2017-08-25 15:37:27 +02:00
|
|
|
orco_out = vec3(0.0, (orco_in.z - 0.5) * -0.5, (orco_in.y - 0.5) * 0.5);
|
2017-05-18 14:29:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void tangent_orco_y(vec3 orco_in, out vec3 orco_out)
|
|
|
|
{
|
2017-08-25 15:37:27 +02:00
|
|
|
orco_out = vec3((orco_in.z - 0.5) * -0.5, 0.0, (orco_in.x - 0.5) * 0.5);
|
2017-05-18 14:29:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void tangent_orco_z(vec3 orco_in, out vec3 orco_out)
|
|
|
|
{
|
2017-08-25 15:37:27 +02:00
|
|
|
orco_out = vec3((orco_in.y - 0.5) * -0.5, (orco_in.x - 0.5) * 0.5, 0.0);
|
2017-05-18 14:29:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void node_tangentmap(vec4 attr_tangent, mat4 toworld, out vec3 tangent)
|
|
|
|
{
|
|
|
|
tangent = (toworld * vec4(attr_tangent.xyz, 0.0)).xyz;
|
|
|
|
}
|
|
|
|
|
|
|
|
void node_tangent(vec3 N, vec3 orco, mat4 objmat, mat4 toworld, out vec3 T)
|
|
|
|
{
|
|
|
|
N = (toworld * vec4(N, 0.0)).xyz;
|
|
|
|
T = (objmat * vec4(orco, 0.0)).xyz;
|
|
|
|
T = cross(N, normalize(cross(T, N)));
|
|
|
|
}
|
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
void node_geometry(
|
2017-05-18 14:29:57 +02:00
|
|
|
vec3 I, vec3 N, vec3 orco, mat4 objmat, mat4 toworld,
|
2016-05-26 18:46:12 +10:00
|
|
|
out vec3 position, out vec3 normal, out vec3 tangent,
|
|
|
|
out vec3 true_normal, out vec3 incoming, out vec3 parametric,
|
|
|
|
out float backfacing, out float pointiness)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2017-07-04 18:02:13 +02:00
|
|
|
position = worldPosition;
|
2016-05-26 18:46:12 +10:00
|
|
|
normal = (toworld * vec4(N, 0.0)).xyz;
|
2017-05-18 14:29:57 +02:00
|
|
|
tangent_orco_z(orco, orco);
|
|
|
|
node_tangent(N, orco, objmat, toworld, tangent);
|
2014-06-04 19:35:56 +02:00
|
|
|
true_normal = normal;
|
|
|
|
|
|
|
|
/* handle perspective/orthographic */
|
2017-03-26 21:19:23 -04:00
|
|
|
vec3 I_view = (ProjectionMatrix[3][3] == 0.0) ? normalize(I) : vec3(0.0, 0.0, -1.0);
|
2016-05-26 18:46:12 +10:00
|
|
|
incoming = -(toworld * vec4(I_view, 0.0)).xyz;
|
2014-06-04 19:35:56 +02:00
|
|
|
|
2011-11-08 11:38:16 +00:00
|
|
|
parametric = vec3(0.0);
|
2016-05-26 18:46:12 +10:00
|
|
|
backfacing = (gl_FrontFacing) ? 0.0 : 1.0;
|
2016-10-01 14:44:11 +02:00
|
|
|
pointiness = 0.5;
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
void node_tex_coord(
|
|
|
|
vec3 I, vec3 N, mat4 viewinvmat, mat4 obinvmat, vec4 camerafac,
|
|
|
|
vec3 attr_orco, vec3 attr_uv,
|
|
|
|
out vec3 generated, out vec3 normal, out vec3 uv, out vec3 object,
|
|
|
|
out vec3 camera, out vec3 window, out vec3 reflection)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2017-08-25 14:19:27 +02:00
|
|
|
generated = attr_orco;
|
2016-05-26 18:46:12 +10:00
|
|
|
normal = normalize((obinvmat * (viewinvmat * vec4(N, 0.0))).xyz);
|
2011-11-08 11:38:16 +00:00
|
|
|
uv = attr_uv;
|
2016-05-26 18:46:12 +10:00
|
|
|
object = (obinvmat * (viewinvmat * vec4(I, 1.0))).xyz;
|
2014-12-31 15:48:05 +01:00
|
|
|
camera = vec3(I.xy, -I.z);
|
2017-03-26 21:19:23 -04:00
|
|
|
vec4 projvec = ProjectionMatrix * vec4(I, 1.0);
|
2016-05-26 18:46:12 +10:00
|
|
|
window = vec3(mtex_2d_mapping(projvec.xyz / projvec.w).xy * camerafac.xy + camerafac.zw, 0.0);
|
2011-11-08 11:38:16 +00:00
|
|
|
|
2018-04-19 18:15:55 +02:00
|
|
|
vec3 shade_I = (ProjectionMatrix[3][3] == 0.0) ? normalize(I) : vec3(0.0, 0.0, -1.0);
|
2014-09-02 15:34:07 +06:00
|
|
|
vec3 view_reflection = reflect(shade_I, normalize(N));
|
2016-05-26 18:46:12 +10:00
|
|
|
reflection = (viewinvmat * vec4(view_reflection, 0.0)).xyz;
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
void node_tex_coord_background(
|
|
|
|
vec3 I, vec3 N, mat4 viewinvmat, mat4 obinvmat, vec4 camerafac,
|
|
|
|
vec3 attr_orco, vec3 attr_uv,
|
|
|
|
out vec3 generated, out vec3 normal, out vec3 uv, out vec3 object,
|
|
|
|
out vec3 camera, out vec3 window, out vec3 reflection)
|
2014-11-24 17:18:56 +01:00
|
|
|
{
|
2017-03-26 21:19:23 -04:00
|
|
|
vec4 v = (ProjectionMatrix[3][3] == 0.0) ? vec4(I, 1.0) : vec4(0.0, 0.0, 1.0, 1.0);
|
|
|
|
vec4 co_homogenous = (ProjectionMatrixInverse * v);
|
2014-11-24 17:18:56 +01:00
|
|
|
|
|
|
|
vec4 co = vec4(co_homogenous.xyz / co_homogenous.w, 0.0);
|
|
|
|
|
|
|
|
co = normalize(co);
|
2017-05-04 17:39:50 +02:00
|
|
|
|
2017-06-29 17:07:41 +02:00
|
|
|
#if defined(WORLD_BACKGROUND) || defined(PROBE_CAPTURE)
|
2017-05-07 15:22:25 +02:00
|
|
|
vec3 coords = (ViewMatrixInverse * co).xyz;
|
2017-05-04 17:39:50 +02:00
|
|
|
#else
|
2017-03-26 21:19:23 -04:00
|
|
|
vec3 coords = (ModelViewMatrixInverse * co).xyz;
|
2017-05-04 17:39:50 +02:00
|
|
|
#endif
|
2014-11-24 17:18:56 +01:00
|
|
|
|
|
|
|
generated = coords;
|
|
|
|
normal = -coords;
|
2014-12-31 15:00:18 +01:00
|
|
|
uv = vec3(attr_uv.xy, 0.0);
|
2014-11-24 17:18:56 +01:00
|
|
|
object = coords;
|
|
|
|
|
2014-12-31 15:00:18 +01:00
|
|
|
camera = vec3(co.xy, -co.z);
|
2017-03-26 21:19:23 -04:00
|
|
|
window = (ProjectionMatrix[3][3] == 0.0) ?
|
2016-05-26 18:46:12 +10:00
|
|
|
vec3(mtex_2d_mapping(I).xy * camerafac.xy + camerafac.zw, 0.0) :
|
|
|
|
vec3(vec2(0.5) * camerafac.xy + camerafac.zw, 0.0);
|
2014-11-24 17:18:56 +01:00
|
|
|
|
|
|
|
reflection = -coords;
|
|
|
|
}
|
|
|
|
|
2017-05-17 19:40:21 +02:00
|
|
|
#if defined(WORLD_BACKGROUND) || (defined(PROBE_CAPTURE) && !defined(MESH_SHADER))
|
2017-05-04 17:39:50 +02:00
|
|
|
#define node_tex_coord node_tex_coord_background
|
|
|
|
#endif
|
|
|
|
|
2011-11-08 11:38:16 +00:00
|
|
|
/* textures */
|
|
|
|
|
2016-05-20 16:39:45 +02:00
|
|
|
float calc_gradient(vec3 p, int gradient_type)
|
|
|
|
{
|
|
|
|
float x, y, z;
|
|
|
|
x = p.x;
|
|
|
|
y = p.y;
|
|
|
|
z = p.z;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (gradient_type == 0) { /* linear */
|
2016-05-20 16:39:45 +02:00
|
|
|
return x;
|
|
|
|
}
|
2016-05-23 10:31:36 +02:00
|
|
|
else if (gradient_type == 1) { /* quadratic */
|
2016-05-20 16:39:45 +02:00
|
|
|
float r = max(x, 0.0);
|
2016-05-26 18:46:12 +10:00
|
|
|
return r * r;
|
2016-05-20 16:39:45 +02:00
|
|
|
}
|
2016-05-23 10:31:36 +02:00
|
|
|
else if (gradient_type == 2) { /* easing */
|
2016-05-20 16:39:45 +02:00
|
|
|
float r = min(max(x, 0.0), 1.0);
|
2016-05-26 18:46:12 +10:00
|
|
|
float t = r * r;
|
|
|
|
return (3.0 * t - 2.0 * t * r);
|
2016-05-20 16:39:45 +02:00
|
|
|
}
|
2016-05-23 10:31:36 +02:00
|
|
|
else if (gradient_type == 3) { /* diagonal */
|
2016-05-20 16:39:45 +02:00
|
|
|
return (x + y) * 0.5;
|
|
|
|
}
|
2016-05-23 10:31:36 +02:00
|
|
|
else if (gradient_type == 4) { /* radial */
|
2016-05-20 16:39:45 +02:00
|
|
|
return atan(y, x) / (M_PI * 2) + 0.5;
|
|
|
|
}
|
|
|
|
else {
|
2017-11-23 16:10:38 +01:00
|
|
|
/* Bias a little bit for the case where p is a unit length vector,
|
|
|
|
* to get exactly zero instead of a small random value depending
|
|
|
|
* on float precision. */
|
|
|
|
float r = max(0.999999 - sqrt(x * x + y * y + z * z), 0.0);
|
2016-05-23 10:31:36 +02:00
|
|
|
if (gradient_type == 5) { /* quadratic sphere */
|
2016-05-26 18:46:12 +10:00
|
|
|
return r * r;
|
2016-05-20 16:39:45 +02:00
|
|
|
}
|
2016-05-23 10:31:36 +02:00
|
|
|
else if (gradient_type == 6) { /* sphere */
|
2016-05-20 16:39:45 +02:00
|
|
|
return r;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void node_tex_gradient(vec3 co, float gradient_type, out vec4 color, out float fac)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2016-05-20 16:39:45 +02:00
|
|
|
float f = calc_gradient(co, int(gradient_type));
|
|
|
|
f = clamp(f, 0.0, 1.0);
|
|
|
|
|
|
|
|
color = vec4(f, f, f, 1.0);
|
|
|
|
fac = f;
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2012-02-08 16:48:26 +00:00
|
|
|
void node_tex_checker(vec3 co, vec4 color1, vec4 color2, float scale, out vec4 color, out float fac)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2016-05-20 15:18:40 +02:00
|
|
|
vec3 p = co * scale;
|
|
|
|
|
|
|
|
/* Prevent precision issues on unit coordinates. */
|
2016-05-26 18:46:12 +10:00
|
|
|
p.x = (p.x + 0.000001) * 0.999999;
|
|
|
|
p.y = (p.y + 0.000001) * 0.999999;
|
|
|
|
p.z = (p.z + 0.000001) * 0.999999;
|
2016-05-20 15:18:40 +02:00
|
|
|
|
2016-05-31 12:30:56 +02:00
|
|
|
int xi = int(abs(floor(p.x)));
|
|
|
|
int yi = int(abs(floor(p.y)));
|
|
|
|
int zi = int(abs(floor(p.z)));
|
2016-05-20 15:18:40 +02:00
|
|
|
|
2016-05-31 12:30:56 +02:00
|
|
|
bool check = ((mod(xi, 2) == mod(yi, 2)) == bool(mod(zi, 2)));
|
2016-05-20 15:18:40 +02:00
|
|
|
|
|
|
|
color = check ? color1 : color2;
|
|
|
|
fac = check ? 1.0 : 0.0;
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2016-11-07 20:55:12 +01:00
|
|
|
vec2 calc_brick_texture(vec3 p, float mortar_size, float mortar_smooth, float bias,
|
2016-05-20 16:13:44 +02:00
|
|
|
float brick_width, float row_height,
|
|
|
|
float offset_amount, int offset_frequency,
|
|
|
|
float squash_amount, int squash_frequency)
|
2012-09-04 13:29:07 +00:00
|
|
|
{
|
2016-05-20 16:13:44 +02:00
|
|
|
int bricknum, rownum;
|
|
|
|
float offset = 0.0;
|
|
|
|
float x, y;
|
|
|
|
|
|
|
|
rownum = floor_to_int(p.y / row_height);
|
|
|
|
|
2016-05-23 10:31:36 +02:00
|
|
|
if (offset_frequency != 0 && squash_frequency != 0) {
|
2016-05-20 16:13:44 +02:00
|
|
|
brick_width *= (rownum % squash_frequency != 0) ? 1.0 : squash_amount; /* squash */
|
2016-05-26 18:46:12 +10:00
|
|
|
offset = (rownum % offset_frequency != 0) ? 0.0 : (brick_width * offset_amount); /* offset */
|
2016-05-20 16:13:44 +02:00
|
|
|
}
|
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
bricknum = floor_to_int((p.x + offset) / brick_width);
|
2016-05-20 16:13:44 +02:00
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
x = (p.x + offset) - brick_width * bricknum;
|
|
|
|
y = p.y - row_height * rownum;
|
2016-05-20 16:13:44 +02:00
|
|
|
|
2016-11-07 20:55:12 +01:00
|
|
|
float tint = clamp((integer_noise((rownum << 16) + (bricknum & 0xFFFF)) + bias), 0.0, 1.0);
|
|
|
|
|
|
|
|
float min_dist = min(min(x, y), min(brick_width - x, row_height - y));
|
2017-06-02 15:38:04 +10:00
|
|
|
if (min_dist >= mortar_size) {
|
2016-11-07 20:55:12 +01:00
|
|
|
return vec2(tint, 0.0);
|
|
|
|
}
|
2017-06-02 15:38:04 +10:00
|
|
|
else if (mortar_smooth == 0.0) {
|
2016-11-07 20:55:12 +01:00
|
|
|
return vec2(tint, 1.0);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
min_dist = 1.0 - min_dist/mortar_size;
|
|
|
|
return vec2(tint, smoothstep(0.0, mortar_smooth, min_dist));
|
|
|
|
}
|
2016-05-20 16:13:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void node_tex_brick(vec3 co,
|
|
|
|
vec4 color1, vec4 color2,
|
|
|
|
vec4 mortar, float scale,
|
2016-11-07 20:55:12 +01:00
|
|
|
float mortar_size, float mortar_smooth, float bias,
|
2016-05-20 16:13:44 +02:00
|
|
|
float brick_width, float row_height,
|
|
|
|
float offset_amount, float offset_frequency,
|
|
|
|
float squash_amount, float squash_frequency,
|
|
|
|
out vec4 color, out float fac)
|
|
|
|
{
|
2016-05-26 18:46:12 +10:00
|
|
|
vec2 f2 = calc_brick_texture(co * scale,
|
2016-11-07 20:55:12 +01:00
|
|
|
mortar_size, mortar_smooth, bias,
|
2016-05-20 16:13:44 +02:00
|
|
|
brick_width, row_height,
|
|
|
|
offset_amount, int(offset_frequency),
|
|
|
|
squash_amount, int(squash_frequency));
|
|
|
|
float tint = f2.x;
|
|
|
|
float f = f2.y;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (f != 1.0) {
|
2016-05-20 16:13:44 +02:00
|
|
|
float facm = 1.0 - tint;
|
|
|
|
color1 = facm * color1 + tint * color2;
|
|
|
|
}
|
2016-11-07 20:59:09 +01:00
|
|
|
color = mix(color1, mortar, f);
|
2016-05-20 16:13:44 +02:00
|
|
|
fac = f;
|
2012-09-04 13:29:07 +00:00
|
|
|
}
|
|
|
|
|
2012-02-08 16:48:26 +00:00
|
|
|
void node_tex_clouds(vec3 co, float size, out vec4 color, out float fac)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2012-02-08 16:48:26 +00:00
|
|
|
color = vec4(1.0);
|
2011-11-08 11:38:16 +00:00
|
|
|
fac = 1.0;
|
|
|
|
}
|
|
|
|
|
2014-11-20 19:43:32 +01:00
|
|
|
void node_tex_environment_equirectangular(vec3 co, sampler2D ima, out vec4 color)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2014-11-20 19:43:32 +01:00
|
|
|
vec3 nco = normalize(co);
|
2016-05-26 18:46:12 +10:00
|
|
|
float u = -atan(nco.y, nco.x) / (2.0 * M_PI) + 0.5;
|
|
|
|
float v = atan(nco.z, hypot(nco.x, nco.y)) / M_PI + 0.5;
|
2014-11-20 19:43:32 +01:00
|
|
|
|
2017-05-04 19:12:19 +02:00
|
|
|
/* Fix pole bleeding */
|
|
|
|
float half_width = 0.5 / float(textureSize(ima, 0).x);
|
|
|
|
v = clamp(v, half_width, 1.0 - half_width);
|
|
|
|
|
|
|
|
/* Fix u = 0 seam */
|
|
|
|
/* This is caused by texture filtering, since uv don't have smooth derivatives
|
|
|
|
* at u = 0 or 2PI, hardware filtering is using the smallest mipmap for certain
|
|
|
|
* texels. So we force the highest mipmap and don't do anisotropic filtering. */
|
|
|
|
color = textureLod(ima, vec2(u, v), 0.0);
|
2014-11-20 19:43:32 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void node_tex_environment_mirror_ball(vec3 co, sampler2D ima, out vec4 color)
|
|
|
|
{
|
|
|
|
vec3 nco = normalize(co);
|
|
|
|
|
|
|
|
nco.y -= 1.0;
|
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
float div = 2.0 * sqrt(max(-0.5 * nco.y, 0.0));
|
2016-05-23 10:31:36 +02:00
|
|
|
if (div > 0.0)
|
2014-11-20 19:43:32 +01:00
|
|
|
nco /= div;
|
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
float u = 0.5 * (nco.x + 1.0);
|
|
|
|
float v = 0.5 * (nco.z + 1.0);
|
2011-11-08 11:38:16 +00:00
|
|
|
|
2017-05-19 10:23:07 -04:00
|
|
|
color = texture(ima, vec2(u, v));
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2012-05-18 13:30:34 +00:00
|
|
|
void node_tex_environment_empty(vec3 co, out vec4 color)
|
|
|
|
{
|
2014-11-26 19:19:25 +01:00
|
|
|
color = vec4(1.0, 0.0, 1.0, 1.0);
|
2012-05-18 13:30:34 +00:00
|
|
|
}
|
|
|
|
|
2018-07-20 15:45:59 +02:00
|
|
|
void node_tex_image_linear(vec3 co, sampler2D ima, out vec4 color, out float alpha)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2017-05-19 10:23:07 -04:00
|
|
|
color = texture(ima, co.xy);
|
2012-06-05 22:12:17 +00:00
|
|
|
alpha = color.a;
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2018-07-20 15:45:59 +02:00
|
|
|
void node_tex_image_nearest(vec3 co, sampler2D ima, out vec4 color, out float alpha)
|
|
|
|
{
|
|
|
|
ivec2 pix = ivec2(co.xy * textureSize(ima, 0).xy);
|
|
|
|
color = texelFetch(ima, pix, 0);
|
|
|
|
alpha = color.a;
|
|
|
|
}
|
|
|
|
|
|
|
|
void node_tex_image_cubic(vec3 co, sampler2D ima, out vec4 color, out float alpha)
|
|
|
|
{
|
2018-07-20 19:16:33 +02:00
|
|
|
vec2 tex_size = vec2(textureSize(ima, 0).xy);
|
|
|
|
|
|
|
|
co.xy *= tex_size;
|
|
|
|
/* texel center */
|
|
|
|
vec2 tc = floor(co.xy - 0.5) + 0.5;
|
|
|
|
vec2 f = co.xy - tc;
|
|
|
|
vec2 f2 = f * f;
|
|
|
|
vec2 f3 = f2 * f;
|
|
|
|
/* Bspline coefs (optimized) */
|
|
|
|
vec2 w3 = f3 / 6.0;
|
|
|
|
vec2 w0 = -w3 + f2 * 0.5 - f * 0.5 + 1.0 / 6.0;
|
|
|
|
vec2 w1 = f3 * 0.5 - f2 * 1.0 + 2.0 / 3.0;
|
|
|
|
vec2 w2 = 1.0 - w0 - w1 - w3;
|
|
|
|
|
|
|
|
#if 1 /* Optimized version using 4 filtered tap. */
|
|
|
|
vec2 s0 = w0 + w1;
|
|
|
|
vec2 s1 = w2 + w3;
|
|
|
|
|
|
|
|
vec2 f0 = w1 / (w0 + w1);
|
|
|
|
vec2 f1 = w3 / (w2 + w3);
|
|
|
|
|
|
|
|
vec4 final_co;
|
|
|
|
final_co.xy = tc - 1.0 + f0;
|
|
|
|
final_co.zw = tc + 1.0 + f1;
|
|
|
|
|
|
|
|
final_co /= tex_size.xyxy;
|
|
|
|
|
|
|
|
color = texture(ima, final_co.xy) * s0.x * s0.y;
|
|
|
|
color += texture(ima, final_co.zy) * s1.x * s0.y;
|
|
|
|
color += texture(ima, final_co.xw) * s0.x * s1.y;
|
|
|
|
color += texture(ima, final_co.zw) * s1.x * s1.y;
|
|
|
|
|
|
|
|
#else /* Reference bruteforce 16 tap. */
|
|
|
|
color = texelFetch(ima, ivec2(tc + vec2(-1.0, -1.0)), 0) * w0.x * w0.y;
|
|
|
|
color += texelFetch(ima, ivec2(tc + vec2( 0.0, -1.0)), 0) * w1.x * w0.y;
|
|
|
|
color += texelFetch(ima, ivec2(tc + vec2( 1.0, -1.0)), 0) * w2.x * w0.y;
|
|
|
|
color += texelFetch(ima, ivec2(tc + vec2( 2.0, -1.0)), 0) * w3.x * w0.y;
|
|
|
|
|
|
|
|
color += texelFetch(ima, ivec2(tc + vec2(-1.0, 0.0)), 0) * w0.x * w1.y;
|
|
|
|
color += texelFetch(ima, ivec2(tc + vec2( 0.0, 0.0)), 0) * w1.x * w1.y;
|
|
|
|
color += texelFetch(ima, ivec2(tc + vec2( 1.0, 0.0)), 0) * w2.x * w1.y;
|
|
|
|
color += texelFetch(ima, ivec2(tc + vec2( 2.0, 0.0)), 0) * w3.x * w1.y;
|
|
|
|
|
|
|
|
color += texelFetch(ima, ivec2(tc + vec2(-1.0, 1.0)), 0) * w0.x * w2.y;
|
|
|
|
color += texelFetch(ima, ivec2(tc + vec2( 0.0, 1.0)), 0) * w1.x * w2.y;
|
|
|
|
color += texelFetch(ima, ivec2(tc + vec2( 1.0, 1.0)), 0) * w2.x * w2.y;
|
|
|
|
color += texelFetch(ima, ivec2(tc + vec2( 2.0, 1.0)), 0) * w3.x * w2.y;
|
|
|
|
|
|
|
|
color += texelFetch(ima, ivec2(tc + vec2(-1.0, 2.0)), 0) * w0.x * w3.y;
|
|
|
|
color += texelFetch(ima, ivec2(tc + vec2( 0.0, 2.0)), 0) * w1.x * w3.y;
|
|
|
|
color += texelFetch(ima, ivec2(tc + vec2( 1.0, 2.0)), 0) * w2.x * w3.y;
|
|
|
|
color += texelFetch(ima, ivec2(tc + vec2( 2.0, 2.0)), 0) * w3.x * w3.y;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
alpha = color.a;
|
2018-07-20 15:45:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void node_tex_image_smart(vec3 co, sampler2D ima, out vec4 color, out float alpha)
|
|
|
|
{
|
|
|
|
/* use cubic for now */
|
|
|
|
node_tex_image_cubic(co, ima, color, alpha);
|
|
|
|
}
|
|
|
|
|
|
|
|
void tex_box_sample_linear(vec3 texco,
|
2018-07-20 15:25:20 +02:00
|
|
|
vec3 N,
|
|
|
|
sampler2D ima,
|
|
|
|
out vec4 color1,
|
|
|
|
out vec4 color2,
|
|
|
|
out vec4 color3)
|
|
|
|
{
|
|
|
|
/* X projection */
|
|
|
|
vec2 uv = texco.yz;
|
|
|
|
if (N.x < 0.0) {
|
|
|
|
uv.x = 1.0 - uv.x;
|
|
|
|
}
|
|
|
|
color1 = texture(ima, uv);
|
|
|
|
/* Y projection */
|
|
|
|
uv = texco.xz;
|
|
|
|
if (N.y > 0.0) {
|
|
|
|
uv.x = 1.0 - uv.x;
|
|
|
|
}
|
|
|
|
color2 = texture(ima, uv);
|
|
|
|
/* Z projection */
|
|
|
|
uv = texco.yx;
|
|
|
|
if (N.z > 0.0) {
|
|
|
|
uv.x = 1.0 - uv.x;
|
|
|
|
}
|
|
|
|
color3 = texture(ima, uv);
|
|
|
|
}
|
|
|
|
|
2018-07-20 15:45:59 +02:00
|
|
|
void tex_box_sample_nearest(vec3 texco,
|
|
|
|
vec3 N,
|
|
|
|
sampler2D ima,
|
|
|
|
out vec4 color1,
|
|
|
|
out vec4 color2,
|
|
|
|
out vec4 color3)
|
|
|
|
{
|
|
|
|
/* X projection */
|
|
|
|
vec2 uv = texco.yz;
|
|
|
|
if (N.x < 0.0) {
|
|
|
|
uv.x = 1.0 - uv.x;
|
|
|
|
}
|
|
|
|
ivec2 pix = ivec2(uv.xy * textureSize(ima, 0).xy);
|
|
|
|
color1 = texelFetch(ima, pix, 0);
|
|
|
|
/* Y projection */
|
|
|
|
uv = texco.xz;
|
|
|
|
if (N.y > 0.0) {
|
|
|
|
uv.x = 1.0 - uv.x;
|
|
|
|
}
|
|
|
|
pix = ivec2(uv.xy * textureSize(ima, 0).xy);
|
|
|
|
color2 = texelFetch(ima, pix, 0);
|
|
|
|
/* Z projection */
|
|
|
|
uv = texco.yx;
|
|
|
|
if (N.z > 0.0) {
|
|
|
|
uv.x = 1.0 - uv.x;
|
|
|
|
}
|
|
|
|
pix = ivec2(uv.xy * textureSize(ima, 0).xy);
|
|
|
|
color3 = texelFetch(ima, pix, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void tex_box_sample_cubic(vec3 texco,
|
|
|
|
vec3 N,
|
|
|
|
sampler2D ima,
|
|
|
|
out vec4 color1,
|
|
|
|
out vec4 color2,
|
|
|
|
out vec4 color3)
|
|
|
|
{
|
2018-07-20 19:16:33 +02:00
|
|
|
float alpha;
|
|
|
|
/* X projection */
|
|
|
|
vec2 uv = texco.yz;
|
|
|
|
if (N.x < 0.0) {
|
|
|
|
uv.x = 1.0 - uv.x;
|
|
|
|
}
|
|
|
|
node_tex_image_cubic(uv.xyy, ima, color1, alpha);
|
|
|
|
/* Y projection */
|
|
|
|
uv = texco.xz;
|
|
|
|
if (N.y > 0.0) {
|
|
|
|
uv.x = 1.0 - uv.x;
|
|
|
|
}
|
|
|
|
node_tex_image_cubic(uv.xyy, ima, color2, alpha);
|
|
|
|
/* Z projection */
|
|
|
|
uv = texco.yx;
|
|
|
|
if (N.z > 0.0) {
|
|
|
|
uv.x = 1.0 - uv.x;
|
|
|
|
}
|
|
|
|
node_tex_image_cubic(uv.xyy, ima, color3, alpha);
|
2018-07-20 15:45:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void tex_box_sample_smart(vec3 texco,
|
|
|
|
vec3 N,
|
|
|
|
sampler2D ima,
|
|
|
|
out vec4 color1,
|
|
|
|
out vec4 color2,
|
|
|
|
out vec4 color3)
|
|
|
|
{
|
|
|
|
tex_box_sample_cubic(texco, N, ima, color1, color2, color3);
|
|
|
|
}
|
|
|
|
|
2016-05-30 10:23:43 +02:00
|
|
|
void node_tex_image_box(vec3 texco,
|
2017-09-05 18:11:13 +02:00
|
|
|
vec3 N,
|
2018-07-20 15:25:20 +02:00
|
|
|
vec4 color1,
|
|
|
|
vec4 color2,
|
|
|
|
vec4 color3,
|
2016-05-30 10:23:43 +02:00
|
|
|
sampler2D ima,
|
|
|
|
float blend,
|
|
|
|
out vec4 color,
|
|
|
|
out float alpha)
|
|
|
|
{
|
|
|
|
/* project from direction vector to barycentric coordinates in triangles */
|
2018-07-20 15:25:20 +02:00
|
|
|
N = abs(N);
|
|
|
|
N /= dot(N, vec3(1.0));
|
2016-05-30 10:23:43 +02:00
|
|
|
|
|
|
|
/* basic idea is to think of this as a triangle, each corner representing
|
|
|
|
* one of the 3 faces of the cube. in the corners we have single textures,
|
|
|
|
* in between we blend between two textures, and in the middle we a blend
|
|
|
|
* between three textures.
|
|
|
|
*
|
|
|
|
* the Nxyz values are the barycentric coordinates in an equilateral
|
|
|
|
* triangle, which in case of blending, in the middle has a smaller
|
|
|
|
* equilateral triangle where 3 textures blend. this divides things into
|
2018-07-20 15:25:20 +02:00
|
|
|
* 7 zones, with an if () test for each zone
|
|
|
|
* EDIT: Now there is only 4 if's. */
|
2016-05-30 10:23:43 +02:00
|
|
|
|
2018-07-20 15:25:20 +02:00
|
|
|
float limit = 0.5 + 0.5 * blend;
|
2016-05-30 10:23:43 +02:00
|
|
|
|
2018-07-20 15:25:20 +02:00
|
|
|
vec3 weight;
|
|
|
|
weight.x = N.x / (N.x + N.y);
|
|
|
|
weight.y = N.y / (N.y + N.z);
|
|
|
|
weight.z = N.z / (N.x + N.z);
|
|
|
|
weight = clamp((weight - 0.5 * (1.0 - blend)) / max(1e-8, blend), 0.0, 1.0);
|
|
|
|
|
|
|
|
/* test for mixes between two textures */
|
|
|
|
if (N.z < (1.0 - limit) * (N.y + N.x)) {
|
|
|
|
weight.z = 0.0;
|
|
|
|
weight.y = 1.0 - weight.x;
|
2016-05-30 10:23:43 +02:00
|
|
|
}
|
2018-07-20 15:25:20 +02:00
|
|
|
else if (N.x < (1.0 - limit) * (N.y + N.z)) {
|
|
|
|
weight.x = 0.0;
|
|
|
|
weight.z = 1.0 - weight.y;
|
2016-05-30 10:23:43 +02:00
|
|
|
}
|
2018-07-20 15:25:20 +02:00
|
|
|
else if (N.y < (1.0 - limit) * (N.x + N.z)) {
|
|
|
|
weight.y = 0.0;
|
|
|
|
weight.x = 1.0 - weight.z;
|
2016-05-30 10:23:43 +02:00
|
|
|
}
|
|
|
|
else {
|
2018-07-20 15:25:20 +02:00
|
|
|
/* last case, we have a mix between three */
|
|
|
|
weight = ((2.0 - limit) * N + (limit - 1.0)) / max(1e-8, 2.0 * limit - 1.0);
|
2016-05-30 10:23:43 +02:00
|
|
|
}
|
|
|
|
|
2018-07-20 15:25:20 +02:00
|
|
|
color = weight.x * color1 + weight.y * color2 + weight.z * color3;
|
2016-05-30 10:23:43 +02:00
|
|
|
alpha = color.a;
|
|
|
|
}
|
|
|
|
|
2012-05-18 13:30:34 +00:00
|
|
|
void node_tex_image_empty(vec3 co, out vec4 color, out float alpha)
|
|
|
|
{
|
|
|
|
color = vec4(0.0);
|
2012-06-05 22:12:17 +00:00
|
|
|
alpha = 0.0;
|
2012-05-18 13:30:34 +00:00
|
|
|
}
|
|
|
|
|
2016-05-20 16:58:40 +02:00
|
|
|
void node_tex_magic(vec3 co, float scale, float distortion, float depth, out vec4 color, out float fac)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2016-05-20 16:58:40 +02:00
|
|
|
vec3 p = co * scale;
|
2016-05-26 18:46:12 +10:00
|
|
|
float x = sin((p.x + p.y + p.z) * 5.0);
|
|
|
|
float y = cos((-p.x + p.y - p.z) * 5.0);
|
|
|
|
float z = -cos((-p.x - p.y + p.z) * 5.0);
|
2016-05-20 16:58:40 +02:00
|
|
|
|
2016-05-23 10:31:36 +02:00
|
|
|
if (depth > 0) {
|
2016-05-20 16:58:40 +02:00
|
|
|
x *= distortion;
|
|
|
|
y *= distortion;
|
|
|
|
z *= distortion;
|
2016-05-26 18:46:12 +10:00
|
|
|
y = -cos(x - y + z);
|
2016-05-20 16:58:40 +02:00
|
|
|
y *= distortion;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (depth > 1) {
|
2016-05-26 18:46:12 +10:00
|
|
|
x = cos(x - y - z);
|
2016-05-20 16:58:40 +02:00
|
|
|
x *= distortion;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (depth > 2) {
|
2016-05-26 18:46:12 +10:00
|
|
|
z = sin(-x - y - z);
|
2016-05-20 16:58:40 +02:00
|
|
|
z *= distortion;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (depth > 3) {
|
2016-05-26 18:46:12 +10:00
|
|
|
x = -cos(-x + y - z);
|
2016-05-20 16:58:40 +02:00
|
|
|
x *= distortion;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (depth > 4) {
|
2016-05-26 18:46:12 +10:00
|
|
|
y = -sin(-x + y + z);
|
2016-05-20 16:58:40 +02:00
|
|
|
y *= distortion;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (depth > 5) {
|
2016-05-26 18:46:12 +10:00
|
|
|
y = -cos(-x + y + z);
|
2016-05-20 16:58:40 +02:00
|
|
|
y *= distortion;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (depth > 6) {
|
2016-05-26 18:46:12 +10:00
|
|
|
x = cos(x + y + z);
|
2016-05-20 16:58:40 +02:00
|
|
|
x *= distortion;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (depth > 7) {
|
2016-05-26 18:46:12 +10:00
|
|
|
z = sin(x + y - z);
|
2016-05-20 16:58:40 +02:00
|
|
|
z *= distortion;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (depth > 8) {
|
2016-05-26 18:46:12 +10:00
|
|
|
x = -cos(-x - y + z);
|
2016-05-20 16:58:40 +02:00
|
|
|
x *= distortion;
|
2016-05-23 10:31:36 +02:00
|
|
|
if (depth > 9) {
|
2016-05-26 18:46:12 +10:00
|
|
|
y = -sin(x - y + z);
|
2016-05-20 16:58:40 +02:00
|
|
|
y *= distortion;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-05-23 10:31:36 +02:00
|
|
|
if (distortion != 0.0) {
|
2016-05-20 16:58:40 +02:00
|
|
|
distortion *= 2.0;
|
|
|
|
x /= distortion;
|
|
|
|
y /= distortion;
|
|
|
|
z /= distortion;
|
|
|
|
}
|
|
|
|
|
2016-05-30 10:21:55 +02:00
|
|
|
color = vec4(0.5 - x, 0.5 - y, 0.5 - z, 1.0);
|
2016-05-20 16:58:40 +02:00
|
|
|
fac = (color.x + color.y + color.z) / 3.0;
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2016-05-20 18:58:56 +02:00
|
|
|
float noise_fade(float t)
|
|
|
|
{
|
|
|
|
return t * t * t * (t * (t * 6.0 - 15.0) + 10.0);
|
|
|
|
}
|
|
|
|
|
|
|
|
float noise_scale3(float result)
|
|
|
|
{
|
|
|
|
return 0.9820 * result;
|
|
|
|
}
|
|
|
|
|
|
|
|
float noise_nerp(float t, float a, float b)
|
|
|
|
{
|
|
|
|
return (1.0 - t) * a + t * b;
|
|
|
|
}
|
|
|
|
|
|
|
|
float noise_grad(uint hash, float x, float y, float z)
|
|
|
|
{
|
|
|
|
uint h = hash & 15u;
|
|
|
|
float u = h < 8u ? x : y;
|
|
|
|
float vt = ((h == 12u) || (h == 14u)) ? x : z;
|
|
|
|
float v = h < 4u ? y : vt;
|
|
|
|
return (((h & 1u) != 0u) ? -u : u) + (((h & 2u) != 0u) ? -v : v);
|
|
|
|
}
|
|
|
|
|
|
|
|
float noise_perlin(float x, float y, float z)
|
|
|
|
{
|
|
|
|
int X; float fx = floorfrac(x, X);
|
|
|
|
int Y; float fy = floorfrac(y, Y);
|
|
|
|
int Z; float fz = floorfrac(z, Z);
|
|
|
|
|
|
|
|
float u = noise_fade(fx);
|
|
|
|
float v = noise_fade(fy);
|
|
|
|
float w = noise_fade(fz);
|
|
|
|
|
2018-01-31 22:31:08 -02:00
|
|
|
float noise_u[2], noise_v[2];
|
|
|
|
|
|
|
|
noise_u[0] = noise_nerp(u,
|
|
|
|
noise_grad(hash(X, Y, Z), fx, fy, fz),
|
|
|
|
noise_grad(hash(X + 1, Y, Z), fx - 1.0, fy, fz));
|
|
|
|
|
|
|
|
noise_u[1] = noise_nerp(u,
|
|
|
|
noise_grad(hash(X, Y + 1, Z), fx, fy - 1.0, fz),
|
|
|
|
noise_grad(hash(X + 1, Y + 1, Z), fx - 1.0, fy - 1.0, fz));
|
|
|
|
|
|
|
|
noise_v[0] = noise_nerp(v, noise_u[0], noise_u[1]);
|
|
|
|
|
|
|
|
noise_u[0] = noise_nerp(u,
|
|
|
|
noise_grad(hash(X, Y, Z + 1), fx, fy, fz - 1.0),
|
|
|
|
noise_grad(hash(X + 1, Y, Z + 1), fx - 1.0, fy, fz - 1.0));
|
|
|
|
|
|
|
|
noise_u[1] = noise_nerp(u,
|
|
|
|
noise_grad(hash(X, Y + 1, Z + 1), fx, fy - 1.0, fz - 1.0),
|
|
|
|
noise_grad(hash(X + 1, Y + 1, Z + 1), fx - 1.0, fy - 1.0, fz - 1.0));
|
|
|
|
|
|
|
|
noise_v[1] = noise_nerp(v, noise_u[0], noise_u[1]);
|
2016-05-20 18:58:56 +02:00
|
|
|
|
2018-01-31 22:31:08 -02:00
|
|
|
return noise_scale3(noise_nerp(w, noise_v[0], noise_v[1]));
|
2016-05-20 18:58:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
float noise(vec3 p)
|
|
|
|
{
|
|
|
|
return 0.5 * noise_perlin(p.x, p.y, p.z) + 0.5;
|
|
|
|
}
|
|
|
|
|
2016-05-22 19:09:42 +02:00
|
|
|
float snoise(vec3 p)
|
|
|
|
{
|
|
|
|
return noise_perlin(p.x, p.y, p.z);
|
|
|
|
}
|
|
|
|
|
2016-05-20 18:58:56 +02:00
|
|
|
float noise_turbulence(vec3 p, float octaves, int hard)
|
|
|
|
{
|
|
|
|
float fscale = 1.0;
|
|
|
|
float amp = 1.0;
|
|
|
|
float sum = 0.0;
|
|
|
|
octaves = clamp(octaves, 0.0, 16.0);
|
2017-05-19 14:20:08 -04:00
|
|
|
int n = int(octaves);
|
|
|
|
for (int i = 0; i <= n; i++) {
|
2016-05-26 18:46:12 +10:00
|
|
|
float t = noise(fscale * p);
|
2016-05-20 18:58:56 +02:00
|
|
|
if (hard != 0) {
|
2016-05-26 18:46:12 +10:00
|
|
|
t = abs(2.0 * t - 1.0);
|
2016-05-20 18:58:56 +02:00
|
|
|
}
|
2016-05-26 18:46:12 +10:00
|
|
|
sum += t * amp;
|
2016-05-20 18:58:56 +02:00
|
|
|
amp *= 0.5;
|
|
|
|
fscale *= 2.0;
|
|
|
|
}
|
|
|
|
float rmd = octaves - floor(octaves);
|
2017-05-19 14:20:08 -04:00
|
|
|
if (rmd != 0.0) {
|
2016-05-26 18:46:12 +10:00
|
|
|
float t = noise(fscale * p);
|
2016-05-20 18:58:56 +02:00
|
|
|
if (hard != 0) {
|
2016-05-26 18:46:12 +10:00
|
|
|
t = abs(2.0 * t - 1.0);
|
2016-05-20 18:58:56 +02:00
|
|
|
}
|
2016-05-26 18:46:12 +10:00
|
|
|
float sum2 = sum + t * amp;
|
|
|
|
sum *= (float(1 << n) / float((1 << (n + 1)) - 1));
|
|
|
|
sum2 *= (float(1 << (n + 1)) / float((1 << (n + 2)) - 1));
|
|
|
|
return (1.0 - rmd) * sum + rmd * sum2;
|
2016-05-20 18:58:56 +02:00
|
|
|
}
|
|
|
|
else {
|
2016-05-26 18:46:12 +10:00
|
|
|
sum *= (float(1 << n) / float((1 << (n + 1)) - 1));
|
2016-05-20 18:58:56 +02:00
|
|
|
return sum;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-02-08 16:48:26 +00:00
|
|
|
void node_tex_noise(vec3 co, float scale, float detail, float distortion, out vec4 color, out float fac)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2016-05-20 18:58:56 +02:00
|
|
|
vec3 p = co * scale;
|
|
|
|
int hard = 0;
|
|
|
|
if (distortion != 0.0) {
|
|
|
|
vec3 r, offset = vec3(13.5, 13.5, 13.5);
|
|
|
|
r.x = noise(p + offset) * distortion;
|
|
|
|
r.y = noise(p) * distortion;
|
|
|
|
r.z = noise(p - offset) * distortion;
|
|
|
|
p += r;
|
|
|
|
}
|
|
|
|
|
|
|
|
fac = noise_turbulence(p, detail, hard);
|
|
|
|
color = vec4(fac,
|
|
|
|
noise_turbulence(vec3(p.y, p.x, p.z), detail, hard),
|
|
|
|
noise_turbulence(vec3(p.y, p.z, p.x), detail, hard),
|
|
|
|
1);
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2016-05-22 19:09:42 +02:00
|
|
|
/* Musgrave fBm
|
|
|
|
*
|
|
|
|
* H: fractal increment parameter
|
|
|
|
* lacunarity: gap between successive frequencies
|
|
|
|
* octaves: number of frequencies in the fBm
|
|
|
|
*
|
|
|
|
* from "Texturing and Modelling: A procedural approach"
|
|
|
|
*/
|
|
|
|
|
|
|
|
float noise_musgrave_fBm(vec3 p, float H, float lacunarity, float octaves)
|
|
|
|
{
|
|
|
|
float rmd;
|
|
|
|
float value = 0.0;
|
|
|
|
float pwr = 1.0;
|
|
|
|
float pwHL = pow(lacunarity, -H);
|
|
|
|
|
2017-05-19 14:20:08 -04:00
|
|
|
for (int i = 0; i < int(octaves); i++) {
|
2016-05-22 19:09:42 +02:00
|
|
|
value += snoise(p) * pwr;
|
|
|
|
pwr *= pwHL;
|
|
|
|
p *= lacunarity;
|
|
|
|
}
|
|
|
|
|
|
|
|
rmd = octaves - floor(octaves);
|
2016-05-23 10:31:36 +02:00
|
|
|
if (rmd != 0.0)
|
2016-05-22 19:09:42 +02:00
|
|
|
value += rmd * snoise(p) * pwr;
|
|
|
|
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Musgrave Multifractal
|
|
|
|
*
|
|
|
|
* H: highest fractal dimension
|
|
|
|
* lacunarity: gap between successive frequencies
|
|
|
|
* octaves: number of frequencies in the fBm
|
|
|
|
*/
|
|
|
|
|
|
|
|
float noise_musgrave_multi_fractal(vec3 p, float H, float lacunarity, float octaves)
|
|
|
|
{
|
|
|
|
float rmd;
|
|
|
|
float value = 1.0;
|
|
|
|
float pwr = 1.0;
|
|
|
|
float pwHL = pow(lacunarity, -H);
|
|
|
|
|
2017-05-19 14:20:08 -04:00
|
|
|
for (int i = 0; i < int(octaves); i++) {
|
2016-05-22 19:09:42 +02:00
|
|
|
value *= (pwr * snoise(p) + 1.0);
|
|
|
|
pwr *= pwHL;
|
|
|
|
p *= lacunarity;
|
|
|
|
}
|
|
|
|
|
|
|
|
rmd = octaves - floor(octaves);
|
2016-05-23 10:31:36 +02:00
|
|
|
if (rmd != 0.0)
|
2016-05-22 19:09:42 +02:00
|
|
|
value *= (rmd * pwr * snoise(p) + 1.0); /* correct? */
|
|
|
|
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Musgrave Heterogeneous Terrain
|
|
|
|
*
|
|
|
|
* H: fractal dimension of the roughest area
|
|
|
|
* lacunarity: gap between successive frequencies
|
|
|
|
* octaves: number of frequencies in the fBm
|
|
|
|
* offset: raises the terrain from `sea level'
|
|
|
|
*/
|
|
|
|
|
|
|
|
float noise_musgrave_hetero_terrain(vec3 p, float H, float lacunarity, float octaves, float offset)
|
|
|
|
{
|
|
|
|
float value, increment, rmd;
|
|
|
|
float pwHL = pow(lacunarity, -H);
|
|
|
|
float pwr = pwHL;
|
|
|
|
|
|
|
|
/* first unscaled octave of function; later octaves are scaled */
|
|
|
|
value = offset + snoise(p);
|
|
|
|
p *= lacunarity;
|
|
|
|
|
2017-05-19 14:20:08 -04:00
|
|
|
for (int i = 1; i < int(octaves); i++) {
|
2016-05-22 19:09:42 +02:00
|
|
|
increment = (snoise(p) + offset) * pwr * value;
|
|
|
|
value += increment;
|
|
|
|
pwr *= pwHL;
|
|
|
|
p *= lacunarity;
|
|
|
|
}
|
|
|
|
|
|
|
|
rmd = octaves - floor(octaves);
|
2016-05-23 10:31:36 +02:00
|
|
|
if (rmd != 0.0) {
|
2016-05-22 19:09:42 +02:00
|
|
|
increment = (snoise(p) + offset) * pwr * value;
|
|
|
|
value += rmd * increment;
|
|
|
|
}
|
|
|
|
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Hybrid Additive/Multiplicative Multifractal Terrain
|
|
|
|
*
|
|
|
|
* H: fractal dimension of the roughest area
|
|
|
|
* lacunarity: gap between successive frequencies
|
|
|
|
* octaves: number of frequencies in the fBm
|
|
|
|
* offset: raises the terrain from `sea level'
|
|
|
|
*/
|
|
|
|
|
|
|
|
float noise_musgrave_hybrid_multi_fractal(vec3 p, float H, float lacunarity, float octaves, float offset, float gain)
|
|
|
|
{
|
|
|
|
float result, signal, weight, rmd;
|
|
|
|
float pwHL = pow(lacunarity, -H);
|
|
|
|
float pwr = pwHL;
|
|
|
|
|
|
|
|
result = snoise(p) + offset;
|
|
|
|
weight = gain * result;
|
|
|
|
p *= lacunarity;
|
|
|
|
|
2017-05-19 14:20:08 -04:00
|
|
|
for (int i = 1; (weight > 0.001f) && (i < int(octaves)); i++) {
|
2016-05-23 10:31:36 +02:00
|
|
|
if (weight > 1.0)
|
2016-05-22 19:09:42 +02:00
|
|
|
weight = 1.0;
|
|
|
|
|
|
|
|
signal = (snoise(p) + offset) * pwr;
|
|
|
|
pwr *= pwHL;
|
|
|
|
result += weight * signal;
|
|
|
|
weight *= gain * signal;
|
|
|
|
p *= lacunarity;
|
|
|
|
}
|
|
|
|
|
|
|
|
rmd = octaves - floor(octaves);
|
2016-05-23 10:31:36 +02:00
|
|
|
if (rmd != 0.0)
|
2016-05-22 19:09:42 +02:00
|
|
|
result += rmd * ((snoise(p) + offset) * pwr);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Ridged Multifractal Terrain
|
|
|
|
*
|
|
|
|
* H: fractal dimension of the roughest area
|
|
|
|
* lacunarity: gap between successive frequencies
|
|
|
|
* octaves: number of frequencies in the fBm
|
|
|
|
* offset: raises the terrain from `sea level'
|
|
|
|
*/
|
|
|
|
|
|
|
|
float noise_musgrave_ridged_multi_fractal(vec3 p, float H, float lacunarity, float octaves, float offset, float gain)
|
|
|
|
{
|
|
|
|
float result, signal, weight;
|
|
|
|
float pwHL = pow(lacunarity, -H);
|
|
|
|
float pwr = pwHL;
|
|
|
|
|
|
|
|
signal = offset - abs(snoise(p));
|
|
|
|
signal *= signal;
|
|
|
|
result = signal;
|
|
|
|
weight = 1.0;
|
|
|
|
|
2017-05-19 14:20:08 -04:00
|
|
|
for (int i = 1; i < int(octaves); i++) {
|
2016-05-22 19:09:42 +02:00
|
|
|
p *= lacunarity;
|
|
|
|
weight = clamp(signal * gain, 0.0, 1.0);
|
|
|
|
signal = offset - abs(snoise(p));
|
|
|
|
signal *= signal;
|
|
|
|
signal *= weight;
|
|
|
|
result += signal * pwr;
|
|
|
|
pwr *= pwHL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
float svm_musgrave(int type,
|
|
|
|
float dimension,
|
|
|
|
float lacunarity,
|
|
|
|
float octaves,
|
|
|
|
float offset,
|
|
|
|
float intensity,
|
|
|
|
float gain,
|
|
|
|
vec3 p)
|
|
|
|
{
|
2017-05-19 14:20:08 -04:00
|
|
|
if (type == 0 /* NODE_MUSGRAVE_MULTIFRACTAL */)
|
2016-05-26 18:46:12 +10:00
|
|
|
return intensity * noise_musgrave_multi_fractal(p, dimension, lacunarity, octaves);
|
2017-05-19 14:20:08 -04:00
|
|
|
else if (type == 1 /* NODE_MUSGRAVE_FBM */)
|
2016-05-26 18:46:12 +10:00
|
|
|
return intensity * noise_musgrave_fBm(p, dimension, lacunarity, octaves);
|
2017-05-19 14:20:08 -04:00
|
|
|
else if (type == 2 /* NODE_MUSGRAVE_HYBRID_MULTIFRACTAL */)
|
2016-05-26 18:46:12 +10:00
|
|
|
return intensity * noise_musgrave_hybrid_multi_fractal(p, dimension, lacunarity, octaves, offset, gain);
|
2017-05-19 14:20:08 -04:00
|
|
|
else if (type == 3 /* NODE_MUSGRAVE_RIDGED_MULTIFRACTAL */)
|
2016-05-26 18:46:12 +10:00
|
|
|
return intensity * noise_musgrave_ridged_multi_fractal(p, dimension, lacunarity, octaves, offset, gain);
|
2017-05-19 14:20:08 -04:00
|
|
|
else if (type == 4 /* NODE_MUSGRAVE_HETERO_TERRAIN */)
|
2016-05-26 18:46:12 +10:00
|
|
|
return intensity * noise_musgrave_hetero_terrain(p, dimension, lacunarity, octaves, offset);
|
2016-05-22 19:09:42 +02:00
|
|
|
return 0.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void node_tex_musgrave(vec3 co,
|
|
|
|
float scale,
|
|
|
|
float detail,
|
|
|
|
float dimension,
|
|
|
|
float lacunarity,
|
|
|
|
float offset,
|
|
|
|
float gain,
|
|
|
|
float type,
|
|
|
|
out vec4 color,
|
|
|
|
out float fac)
|
|
|
|
{
|
|
|
|
fac = svm_musgrave(int(type),
|
|
|
|
dimension,
|
|
|
|
lacunarity,
|
|
|
|
detail,
|
|
|
|
offset,
|
|
|
|
1.0,
|
|
|
|
gain,
|
2016-05-26 18:46:12 +10:00
|
|
|
co * scale);
|
2016-05-22 19:09:42 +02:00
|
|
|
|
|
|
|
color = vec4(fac, fac, fac, 1.0);
|
|
|
|
}
|
|
|
|
|
2011-11-08 11:38:16 +00:00
|
|
|
void node_tex_sky(vec3 co, out vec4 color)
|
|
|
|
{
|
|
|
|
color = vec4(1.0);
|
|
|
|
}
|
|
|
|
|
2018-07-14 13:11:28 +02:00
|
|
|
void node_tex_voronoi(vec3 co, float scale, float exponent, float coloring, out vec4 color, out float fac)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2016-05-20 18:05:29 +02:00
|
|
|
vec3 p = co * scale;
|
|
|
|
int xx, yy, zz, xi, yi, zi;
|
|
|
|
float da[4];
|
|
|
|
vec3 pa[4];
|
|
|
|
|
|
|
|
xi = floor_to_int(p[0]);
|
|
|
|
yi = floor_to_int(p[1]);
|
|
|
|
zi = floor_to_int(p[2]);
|
|
|
|
|
|
|
|
da[0] = 1e+10;
|
|
|
|
da[1] = 1e+10;
|
|
|
|
da[2] = 1e+10;
|
|
|
|
da[3] = 1e+10;
|
|
|
|
|
|
|
|
for (xx = xi - 1; xx <= xi + 1; xx++) {
|
|
|
|
for (yy = yi - 1; yy <= yi + 1; yy++) {
|
|
|
|
for (zz = zi - 1; zz <= zi + 1; zz++) {
|
|
|
|
vec3 ip = vec3(xx, yy, zz);
|
|
|
|
vec3 vp = cellnoise_color(ip);
|
|
|
|
vec3 pd = p - (vp + ip);
|
|
|
|
float d = dot(pd, pd);
|
|
|
|
vp += vec3(xx, yy, zz);
|
|
|
|
if (d < da[0]) {
|
|
|
|
da[3] = da[2];
|
|
|
|
da[2] = da[1];
|
|
|
|
da[1] = da[0];
|
|
|
|
da[0] = d;
|
|
|
|
pa[3] = pa[2];
|
|
|
|
pa[2] = pa[1];
|
|
|
|
pa[1] = pa[0];
|
|
|
|
pa[0] = vp;
|
|
|
|
}
|
|
|
|
else if (d < da[1]) {
|
|
|
|
da[3] = da[2];
|
|
|
|
da[2] = da[1];
|
|
|
|
da[1] = d;
|
|
|
|
|
|
|
|
pa[3] = pa[2];
|
|
|
|
pa[2] = pa[1];
|
|
|
|
pa[1] = vp;
|
|
|
|
}
|
|
|
|
else if (d < da[2]) {
|
|
|
|
da[3] = da[2];
|
|
|
|
da[2] = d;
|
|
|
|
|
|
|
|
pa[3] = pa[2];
|
|
|
|
pa[2] = vp;
|
|
|
|
}
|
|
|
|
else if (d < da[3]) {
|
|
|
|
da[3] = d;
|
|
|
|
pa[3] = vp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (coloring == 0.0) {
|
|
|
|
fac = abs(da[0]);
|
|
|
|
color = vec4(fac, fac, fac, 1);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
color = vec4(cellnoise_color(pa[0]), 1);
|
|
|
|
fac = (color.x + color.y + color.z) * (1.0 / 3.0);
|
|
|
|
}
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2016-05-20 21:21:57 +02:00
|
|
|
float calc_wave(vec3 p, float distortion, float detail, float detail_scale, int wave_type, int wave_profile)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2016-05-20 21:21:57 +02:00
|
|
|
float n;
|
|
|
|
|
2016-05-23 10:31:36 +02:00
|
|
|
if (wave_type == 0) /* type bands */
|
2016-05-20 21:21:57 +02:00
|
|
|
n = (p.x + p.y + p.z) * 10.0;
|
|
|
|
else /* type rings */
|
|
|
|
n = length(p) * 20.0;
|
|
|
|
|
2016-05-23 10:31:36 +02:00
|
|
|
if (distortion != 0.0)
|
2016-05-26 18:46:12 +10:00
|
|
|
n += distortion * noise_turbulence(p * detail_scale, detail, 0);
|
2016-05-20 21:21:57 +02:00
|
|
|
|
2016-05-23 10:31:36 +02:00
|
|
|
if (wave_profile == 0) { /* profile sin */
|
2016-05-20 21:21:57 +02:00
|
|
|
return 0.5 + 0.5 * sin(n);
|
|
|
|
}
|
|
|
|
else { /* profile saw */
|
|
|
|
n /= 2.0 * M_PI;
|
|
|
|
n -= int(n);
|
2016-05-26 18:46:12 +10:00
|
|
|
return (n < 0.0) ? n + 1.0 : n;
|
2016-05-20 21:21:57 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-05-23 19:56:50 +10:00
|
|
|
void node_tex_wave(
|
|
|
|
vec3 co, float scale, float distortion, float detail, float detail_scale, float wave_type, float wave_profile,
|
|
|
|
out vec4 color, out float fac)
|
2016-05-20 21:21:57 +02:00
|
|
|
{
|
|
|
|
float f;
|
2016-05-26 18:46:12 +10:00
|
|
|
f = calc_wave(co * scale, distortion, detail, detail_scale, int(wave_type), int(wave_profile));
|
2016-05-20 21:21:57 +02:00
|
|
|
|
|
|
|
color = vec4(f, f, f, 1.0);
|
|
|
|
fac = f;
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* light path */
|
|
|
|
|
|
|
|
void node_light_path(
|
|
|
|
out float is_camera_ray,
|
|
|
|
out float is_shadow_ray,
|
|
|
|
out float is_diffuse_ray,
|
|
|
|
out float is_glossy_ray,
|
2011-12-01 19:31:36 +00:00
|
|
|
out float is_singular_ray,
|
2011-11-08 11:38:16 +00:00
|
|
|
out float is_reflection_ray,
|
2012-10-18 12:37:51 +00:00
|
|
|
out float is_transmission_ray,
|
2014-03-06 09:06:20 +01:00
|
|
|
out float ray_length,
|
2014-04-21 16:31:46 +02:00
|
|
|
out float ray_depth,
|
2017-01-29 16:00:14 +01:00
|
|
|
out float diffuse_depth,
|
|
|
|
out float glossy_depth,
|
2016-01-06 23:38:13 +01:00
|
|
|
out float transparent_depth,
|
|
|
|
out float transmission_depth)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2017-05-10 10:32:22 +02:00
|
|
|
#ifndef PROBE_CAPTURE
|
2011-11-08 11:38:16 +00:00
|
|
|
is_camera_ray = 1.0;
|
|
|
|
is_glossy_ray = 0.0;
|
2017-05-10 10:32:22 +02:00
|
|
|
is_diffuse_ray = 0.0;
|
2011-11-08 11:38:16 +00:00
|
|
|
is_reflection_ray = 0.0;
|
|
|
|
is_transmission_ray = 0.0;
|
2017-05-10 10:32:22 +02:00
|
|
|
#else
|
|
|
|
is_camera_ray = 0.0;
|
|
|
|
is_glossy_ray = 1.0;
|
|
|
|
is_diffuse_ray = 1.0;
|
|
|
|
is_reflection_ray = 1.0;
|
|
|
|
is_transmission_ray = 1.0;
|
|
|
|
#endif
|
|
|
|
is_shadow_ray = 0.0;
|
|
|
|
is_singular_ray = 0.0;
|
2012-10-18 12:37:51 +00:00
|
|
|
ray_length = 1.0;
|
2014-03-06 09:06:20 +01:00
|
|
|
ray_depth = 1.0;
|
2017-01-29 16:00:14 +01:00
|
|
|
diffuse_depth = 1.0;
|
|
|
|
glossy_depth = 1.0;
|
2014-04-21 16:31:46 +02:00
|
|
|
transparent_depth = 1.0;
|
2016-01-06 23:38:13 +01:00
|
|
|
transmission_depth = 1.0;
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2012-05-09 10:14:01 +00:00
|
|
|
void node_light_falloff(float strength, float tsmooth, out float quadratic, out float linear, out float constant)
|
2012-05-07 20:24:38 +00:00
|
|
|
{
|
|
|
|
quadratic = strength;
|
|
|
|
linear = strength;
|
|
|
|
constant = strength;
|
|
|
|
}
|
|
|
|
|
2017-04-14 18:13:44 +03:00
|
|
|
void node_object_info(mat4 obmat, vec3 info, out vec3 location, out float object_index, out float material_index, out float random)
|
2012-05-21 12:52:28 +00:00
|
|
|
{
|
2017-04-14 18:13:44 +03:00
|
|
|
location = obmat[3].xyz;
|
|
|
|
object_index = info.x;
|
|
|
|
material_index = info.y;
|
|
|
|
random = info.z;
|
2012-05-21 12:52:28 +00:00
|
|
|
}
|
|
|
|
|
2016-04-26 18:43:02 +10:00
|
|
|
void node_normal_map(vec4 tangent, vec3 normal, vec3 texnormal, out vec3 outnormal)
|
2013-05-27 17:48:02 +00:00
|
|
|
{
|
2016-04-26 18:43:02 +10:00
|
|
|
vec3 B = tangent.w * cross(normal, tangent.xyz);
|
|
|
|
|
|
|
|
outnormal = texnormal.x * tangent.xyz + texnormal.y * B + texnormal.z * normal;
|
|
|
|
outnormal = normalize(outnormal);
|
2013-05-27 17:48:02 +00:00
|
|
|
}
|
|
|
|
|
2016-05-22 16:47:06 +02:00
|
|
|
void node_bump(float strength, float dist, float height, vec3 N, vec3 surf_pos, float invert, out vec3 result)
|
2012-10-18 12:37:51 +00:00
|
|
|
{
|
2016-05-22 16:47:06 +02:00
|
|
|
if (invert != 0.0) {
|
|
|
|
dist *= -1.0;
|
|
|
|
}
|
2016-05-20 14:16:54 +02:00
|
|
|
vec3 dPdx = dFdx(surf_pos);
|
|
|
|
vec3 dPdy = dFdy(surf_pos);
|
|
|
|
|
|
|
|
/* Get surface tangents from normal. */
|
|
|
|
vec3 Rx = cross(dPdy, N);
|
|
|
|
vec3 Ry = cross(N, dPdx);
|
|
|
|
|
|
|
|
/* Compute surface gradient and determinant. */
|
|
|
|
float det = dot(dPdx, Rx);
|
|
|
|
float absdet = abs(det);
|
|
|
|
|
|
|
|
float dHdx = dFdx(height);
|
|
|
|
float dHdy = dFdy(height);
|
2016-05-26 18:46:12 +10:00
|
|
|
vec3 surfgrad = dHdx * Rx + dHdy * Ry;
|
2016-05-20 14:16:54 +02:00
|
|
|
|
|
|
|
strength = max(strength, 0.0);
|
|
|
|
|
2016-05-26 18:46:12 +10:00
|
|
|
result = normalize(absdet * N - dist * sign(det) * surfgrad);
|
|
|
|
result = normalize(strength * result + (1.0 - strength) * N);
|
2012-10-18 12:37:51 +00:00
|
|
|
}
|
2012-05-21 12:52:28 +00:00
|
|
|
|
2017-08-18 18:37:05 +02:00
|
|
|
void node_bevel(float radius, vec3 N, out vec3 result)
|
|
|
|
{
|
|
|
|
result = N;
|
|
|
|
}
|
|
|
|
|
2018-05-29 12:27:34 +02:00
|
|
|
void node_hair_info(out float is_strand, out float intercept, out float thickness, out vec3 tangent, out float random)
|
|
|
|
{
|
|
|
|
#ifdef HAIR_SHADER
|
|
|
|
is_strand = 1.0;
|
|
|
|
intercept = hairTime;
|
|
|
|
thickness = hairThickness;
|
2018-06-01 23:10:23 +02:00
|
|
|
tangent = normalize(hairTangent);
|
2018-06-02 09:25:23 +02:00
|
|
|
random = wang_hash_noise(uint(hairStrandID)); /* TODO: could be precomputed per strand instead. */
|
2018-05-29 12:27:34 +02:00
|
|
|
#else
|
|
|
|
is_strand = 0.0;
|
|
|
|
intercept = 0.0;
|
|
|
|
thickness = 0.0;
|
|
|
|
tangent = vec3(1.0);
|
|
|
|
random = 0.0;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2018-01-21 00:40:42 +01:00
|
|
|
void node_displacement_object(float height, float midlevel, float scale, vec3 N, mat4 obmat, out vec3 result)
|
2018-01-13 13:11:03 +01:00
|
|
|
{
|
2018-01-21 00:40:42 +01:00
|
|
|
N = (vec4(N, 0.0) * obmat).xyz;
|
|
|
|
result = (height - midlevel) * scale * normalize(N);
|
|
|
|
result = (obmat * vec4(result, 0.0)).xyz;
|
|
|
|
}
|
|
|
|
|
|
|
|
void node_displacement_world(float height, float midlevel, float scale, vec3 N, out vec3 result)
|
|
|
|
{
|
|
|
|
result = (height - midlevel) * scale * normalize(N);
|
|
|
|
}
|
|
|
|
|
|
|
|
void node_vector_displacement_tangent(vec4 vector, float midlevel, float scale, vec4 tangent, vec3 normal, mat4 obmat, mat4 viewmat, out vec3 result)
|
|
|
|
{
|
|
|
|
vec3 N_object = normalize(((vec4(normal, 0.0) * viewmat) * obmat).xyz);
|
|
|
|
vec3 T_object = normalize(((vec4(tangent.xyz, 0.0) * viewmat) * obmat).xyz);
|
|
|
|
vec3 B_object = tangent.w * normalize(cross(N_object, T_object));
|
|
|
|
|
|
|
|
vec3 offset = (vector.xyz - vec3(midlevel)) * scale;
|
|
|
|
result = offset.x * T_object + offset.y * N_object + offset.z * B_object;
|
|
|
|
result = (obmat * vec4(result, 0.0)).xyz;
|
|
|
|
}
|
|
|
|
|
|
|
|
void node_vector_displacement_object(vec4 vector, float midlevel, float scale, mat4 obmat, out vec3 result)
|
|
|
|
{
|
|
|
|
result = (vector.xyz - vec3(midlevel)) * scale;
|
|
|
|
result = (obmat * vec4(result, 0.0)).xyz;
|
|
|
|
}
|
|
|
|
|
|
|
|
void node_vector_displacement_world(vec4 vector, float midlevel, float scale, out vec3 result)
|
|
|
|
{
|
|
|
|
result = (vector.xyz - vec3(midlevel)) * scale;
|
2018-01-13 13:11:03 +01:00
|
|
|
}
|
|
|
|
|
2011-11-08 11:38:16 +00:00
|
|
|
/* output */
|
|
|
|
|
2018-01-23 13:11:02 +01:00
|
|
|
void node_output_material(Closure surface, Closure volume, vec3 displacement, out Closure result)
|
2011-11-08 11:38:16 +00:00
|
|
|
{
|
2017-10-27 16:20:33 +02:00
|
|
|
#ifdef VOLUMETRICS
|
|
|
|
result = volume;
|
|
|
|
#else
|
2011-11-08 11:38:16 +00:00
|
|
|
result = surface;
|
2017-10-27 16:20:33 +02:00
|
|
|
#endif
|
2011-11-08 11:38:16 +00:00
|
|
|
}
|
|
|
|
|
2017-06-24 05:24:59 +02:00
|
|
|
uniform float backgroundAlpha;
|
|
|
|
|
2017-07-03 21:39:52 +02:00
|
|
|
void node_output_world(Closure surface, Closure volume, out Closure result)
|
2014-11-24 17:18:56 +01:00
|
|
|
{
|
2017-07-03 22:08:07 +02:00
|
|
|
#ifndef VOLUMETRICS
|
2017-11-13 21:56:49 +01:00
|
|
|
result.radiance = surface.radiance;
|
|
|
|
result.opacity = backgroundAlpha;
|
2017-07-03 22:08:07 +02:00
|
|
|
#else
|
|
|
|
result = volume;
|
|
|
|
#endif /* VOLUMETRICS */
|
2014-11-24 17:18:56 +01:00
|
|
|
}
|
|
|
|
|
2017-07-03 22:08:07 +02:00
|
|
|
#ifndef VOLUMETRICS
|
2017-05-10 10:31:17 +02:00
|
|
|
/* TODO : clean this ifdef mess */
|
|
|
|
/* EEVEE output */
|
2017-05-02 19:25:25 +02:00
|
|
|
void world_normals_get(out vec3 N)
|
|
|
|
{
|
2018-06-02 13:02:13 +02:00
|
|
|
#ifdef HAIR_SHADER
|
|
|
|
vec3 B = normalize(cross(worldNormal, hairTangent));
|
|
|
|
float cos_theta;
|
|
|
|
if (hairThicknessRes == 1) {
|
|
|
|
vec4 rand = texelFetch(utilTex, ivec3(ivec2(gl_FragCoord.xy) % LUT_SIZE, 2.0), 0);
|
|
|
|
/* Random cosine normal distribution on the hair surface. */
|
|
|
|
cos_theta = rand.x * 2.0 - 1.0;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* Shade as a cylinder. */
|
|
|
|
cos_theta = hairThickTime / hairThickness;
|
|
|
|
}
|
|
|
|
float sin_theta = sqrt(max(0.0, 1.0f - cos_theta*cos_theta));;
|
|
|
|
N = normalize(worldNormal * sin_theta + B * cos_theta);
|
|
|
|
#else
|
2017-05-02 19:25:25 +02:00
|
|
|
N = gl_FrontFacing ? worldNormal : -worldNormal;
|
2018-06-02 13:02:13 +02:00
|
|
|
#endif
|
2017-05-02 19:25:25 +02:00
|
|
|
}
|
|
|
|
|
2017-06-20 14:33:13 +02:00
|
|
|
void node_eevee_specular(
|
2017-05-02 19:25:25 +02:00
|
|
|
vec4 diffuse, vec4 specular, float roughness, vec4 emissive, float transp, vec3 normal,
|
|
|
|
float clearcoat, float clearcoat_roughness, vec3 clearcoat_normal,
|
2017-07-15 16:09:44 +02:00
|
|
|
float occlusion, float ssr_id, out Closure result)
|
2017-05-02 19:25:25 +02:00
|
|
|
{
|
2017-11-24 06:15:42 +01:00
|
|
|
vec3 out_diff, out_spec, ssr_spec;
|
|
|
|
eevee_closure_default(normal, diffuse.rgb, specular.rgb, int(ssr_id), roughness, occlusion,
|
|
|
|
out_diff, out_spec, ssr_spec);
|
2017-07-16 23:49:25 +02:00
|
|
|
|
2017-07-17 13:39:03 +02:00
|
|
|
vec3 vN = normalize(mat3(ViewMatrix) * normal);
|
2017-11-14 00:49:54 +01:00
|
|
|
result = CLOSURE_DEFAULT;
|
2017-11-24 06:15:42 +01:00
|
|
|
result.radiance = out_diff * diffuse.rgb + out_spec + emissive.rgb;
|
2017-11-13 21:56:49 +01:00
|
|
|
result.opacity = 1.0 - transp;
|
|
|
|
result.ssr_data = vec4(ssr_spec, roughness);
|
|
|
|
result.ssr_normal = normal_encode(vN, viewCameraVec);
|
|
|
|
result.ssr_id = int(ssr_id);
|
2017-05-02 19:25:25 +02:00
|
|
|
}
|
2017-06-19 16:31:10 +02:00
|
|
|
|
2018-05-18 15:33:04 +02:00
|
|
|
void node_shader_to_rgba(Closure cl, out vec4 outcol, out float outalpha)
|
2018-05-14 13:34:54 +02:00
|
|
|
{
|
|
|
|
vec4 spec_accum = vec4(0.0);
|
|
|
|
if (ssrToggle && cl.ssr_id == outputSsrId) {
|
|
|
|
vec3 V = cameraVec;
|
|
|
|
vec3 vN = normal_decode(cl.ssr_normal, viewCameraVec);
|
|
|
|
vec3 N = transform_direction(ViewMatrixInverse, vN);
|
|
|
|
float roughness = cl.ssr_data.a;
|
|
|
|
float roughnessSquared = max(1e-3, roughness * roughness);
|
|
|
|
fallback_cubemap(N, V, worldPosition, viewPosition, roughness, roughnessSquared, spec_accum);
|
|
|
|
}
|
|
|
|
|
|
|
|
outalpha = cl.opacity;
|
|
|
|
outcol = vec4((spec_accum.rgb * cl.ssr_data.rgb) + cl.radiance, 1.0);
|
|
|
|
|
|
|
|
# ifdef USE_SSS
|
|
|
|
# ifdef USE_SSS_ALBEDO
|
2018-05-18 15:31:07 +02:00
|
|
|
outcol.rgb += cl.sss_data.rgb * cl.sss_albedo;
|
2018-05-14 13:34:54 +02:00
|
|
|
# else
|
2018-05-18 15:31:07 +02:00
|
|
|
outcol.rgb += cl.sss_data.rgb;
|
2018-05-14 13:34:54 +02:00
|
|
|
# endif
|
|
|
|
# endif
|
|
|
|
}
|
|
|
|
|
2017-07-03 22:08:07 +02:00
|
|
|
#endif /* VOLUMETRICS */
|