Module: Mittsu

Defined in:
lib/mittsu/materials/shader_material.rb,
lib/mittsu/math.rb,
lib/mittsu/version.rb,
lib/mittsu/math/ray.rb,
lib/mittsu/constants.rb,
lib/mittsu/math/box2.rb,
lib/mittsu/math/box3.rb,
lib/mittsu/core/clock.rb,
lib/mittsu/core/face3.rb,
lib/mittsu/math/color.rb,
lib/mittsu/math/euler.rb,
lib/mittsu/math/line3.rb,
lib/mittsu/math/plane.rb,
lib/mittsu/math/sphere.rb,
lib/mittsu/math/spline.rb,
lib/mittsu/extras/image.rb,
lib/mittsu/lights/light.rb,
lib/mittsu/math/frustum.rb,
lib/mittsu/math/matrix3.rb,
lib/mittsu/math/matrix4.rb,
lib/mittsu/math/vector2.rb,
lib/mittsu/math/vector3.rb,
lib/mittsu/math/vector4.rb,
lib/mittsu/objects/line.rb,
lib/mittsu/objects/mesh.rb,
lib/mittsu/scenes/scene.rb,
lib/mittsu/core/geometry.rb,
lib/mittsu/loaders/cache.rb,
lib/mittsu/math/triangle.rb,
lib/mittsu/objects/group.rb,
lib/mittsu/cameras/camera.rb,
lib/mittsu/core/object_3d.rb,
lib/mittsu/core/raycaster.rb,
lib/mittsu/loaders/loader.rb,
lib/mittsu/core/hash_array.rb,
lib/mittsu/math/quaternion.rb,
lib/mittsu/core/hash_object.rb,
lib/mittsu/textures/texture.rb,
lib/mittsu/lights/area_light.rb,
lib/mittsu/lights/spot_light.rb,
lib/mittsu/extras/image_utils.rb,
lib/mittsu/lights/point_light.rb,
lib/mittsu/loaders/mtl_loader.rb,
lib/mittsu/materials/material.rb,
lib/mittsu/cameras/cube_camera.rb,
lib/mittsu/loaders/file_loader.rb,
lib/mittsu/math/color_keywords.rb,
lib/mittsu/core/buffer_geometry.rb,
lib/mittsu/lights/ambient_light.rb,
lib/mittsu/loaders/image_loader.rb,
lib/mittsu/core/buffer_attribute.rb,
lib/mittsu/core/event_dispatcher.rb,
lib/mittsu/renderers/glfw_window.rb,
lib/mittsu/textures/cube_texture.rb,
lib/mittsu/textures/data_texture.rb,
lib/mittsu/loaders/obj_mtl_loader.rb,
lib/mittsu/textures/video_texture.rb,
lib/mittsu/lights/hemisphere_light.rb,
lib/mittsu/loaders/loading_manager.rb,
lib/mittsu/lights/directional_light.rb,
lib/mittsu/renderers/opengl_renderer.rb,
lib/mittsu/cameras/perspective_camera.rb,
lib/mittsu/cameras/orthographic_camera.rb,
lib/mittsu/textures/compressed_texture.rb,
lib/mittsu/extras/helpers/camera_helper.rb,
lib/mittsu/materials/mesh_face_material.rb,
lib/mittsu/renderers/shaders/shader_lib.rb,
lib/mittsu/core/dynamic_buffer_attribute.rb,
lib/mittsu/materials/line_basic_material.rb,
lib/mittsu/materials/mesh_basic_material.rb,
lib/mittsu/materials/mesh_phong_material.rb,
lib/mittsu/renderers/opengl/opengl_state.rb,
lib/mittsu/extras/geometries/box_geometry.rb,
lib/mittsu/renderers/opengl/opengl_shader.rb,
lib/mittsu/renderers/opengl_render_target.rb,
lib/mittsu/renderers/shaders/shader_chunk.rb,
lib/mittsu/renderers/shaders/uniforms_lib.rb,
lib/mittsu/materials/mesh_lambert_material.rb,
lib/mittsu/renderers/opengl/opengl_program.rb,
lib/mittsu/renderers/shaders/uniforms_utils.rb,
lib/mittsu/extras/geometries/sphere_geometry.rb,
lib/mittsu/renderers/opengl/plugins/shadow_map_plugin.rb

Overview

parameters =

color: <hex>,
emissive: <hex>,
specular: <hex>,
shininess: <float>,
opacity: <float>,

map: Texture.new(<Image>),

lightMap: Texture.new(<Image>),

bumpMap: Texture.new(<Image>),
bumpScale: <float>,

normalMap: Texture.new(<Image>),
normalScale: <Vector2>,

specularMap: Texture.new(<Image>),

alphaMap: Texture.new(<Image>),

envMap: TextureCube.new([posx, negx, posy, negy, posz, negz]),
combine: Multiply,
reflectivity: <float>,
refractionRatio: <float>,

shading: SmoothShading,
blending: NormalBlending,
depthTest: <bool>,
depthWrite: <bool>,

wireframe: <boolean>,
wireframeLinewidth: <float>,

vertexColors: NoColors / VertexColors / FaceColors,

skinning: <bool>,
morphTargets: <bool>,
morphNormals: <bool>,

fog: <bool>


Defined Under Namespace

Modules: Cache, EventDispatcher, GLFW, ImageUtils, Math, UniformsUtils Classes: AmbientLight, AreaLight, Box2, Box3, BoxGeometry, BufferAttribute, BufferGeometry, Camera, CameraHelper, Clock, Color, CompressedTexture, CubeCamera, CubeTexture, DataTexture, DirectionalLight, DynamicBufferAttribute, Euler, Face3, FileLoader, Frustum, Geometry, Group, HashArray, HashObject, HemisphereLight, Image, ImageLoader, Light, Line, Line3, LineBasicMaterial, Loader, LoadingManager, MTLLoader, Material, Matrix3, Matrix4, Mesh, MeshBasicMaterial, MeshFaceMaterial, MeshLambertMaterial, MeshPhongMaterial, OBJMTLLoader, Object3D, OpenGLProgram, OpenGLRenderTarget, OpenGLRenderer, OpenGLShader, OpenGLState, OrthographicCamera, PerspectiveCamera, Plane, PointLight, Quaternion, Ray, Raycaster, Scene, ShaderLib_Instance, ShaderMaterial, ShadowMapPlugin, Sphere, SphereGeometry, Spline, SpotLight, Texture, Triangle, Uniform, Vector2, Vector3, Vector4, VideoTexture

Constant Summary collapse

VERSION =
"0.1.1"
REVISION =
"71"
MOUSE_LEFT =
0
MOUSE_MIDDLE =
1
MOUSE_RIGHT =
2
CullFaceNone =

GL STATE CONSTANTS

0
CullFaceBack =
1
CullFaceFront =
2
CullFaceFrontBack =
3
FrontFaceDirectionCW =
0
FrontFaceDirectionCCW =
1
BasicShadowMap =

SHADOWING TYPES

0
PCFShadowMap =
1
PCFSoftShadowMap =
2
FrontSide =

side

0
BackSide =
1
DoubleSide =
2
NoShading =

shading

false
FlatShading =
1
SmoothShading =
2
NoColors =

colors

false
FaceColors =
1
VertexColors =
2
NoBlending =

blending modes

false
NormalBlending =
1
AdditiveBlending =
2
SubtractiveBlending =
3
MultiplyBlending =
4
CustomBlending =
5
AddEquation =

custom blending equations (numbers start from 100 not to clash with other

mappings to OpenGL constants defined in texture.rb)
100
SubtractEquation =
101
ReverseSubtractEquation =
102
MinEquation =
103
MaxEquation =
104
ZeroFactor =

custom blending destination factors

200
OneFactor =
201
SrcColorFactor =
202
OneMinusSrcColorFactor =
203
SrcAlphaFactor =
204
OneMinusSrcAlphaFactor =
205
DstAlphaFactor =
206
OneMinusDstAlphaFactor =
207
DstColorFactor =

ZeroFactor = 200 OneFactor = 201 SrcAlphaFactor = 204 OneMinusSrcAlphaFactor = 205 DstAlphaFactor = 206 OneMinusDstAlphaFactor = 207

208
OneMinusDstColorFactor =
209
SrcAlphaSaturateFactor =
210
MultiplyOperation =

TEXTURE CONSTANTS

0
MixOperation =
1
AddOperation =
2
UVMapping =

Mapping modes

300
CubeReflectionMapping =
301
CubeRefractionMapping =
302
EquirectangularReflectionMapping =
303
EquirectangularRefractionMapping =
304
SphericalReflectionMapping =
305
RepeatWrapping =

Wrapping modes

1000
ClampToEdgeWrapping =
1001
MirroredRepeatWrapping =
1002
NearestFilter =

Filters

1003
NearestMipMapNearestFilter =
1004
NearestMipMapLinearFilter =
1005
LinearFilter =
1006
LinearMipMapNearestFilter =
1007
LinearMipMapLinearFilter =
1008
UnsignedByteType =

Data types

1009
ByteType =
1010
ShortType =
1011
UnsignedShortType =
1012
IntType =
1013
UnsignedIntType =
1014
FloatType =
1015
HalfFloatType =
1025
UnsignedShort4444Type =

UnsignedByteType = 1009

1016
UnsignedShort5551Type =
1017
UnsignedShort565Type =
1018
AlphaFormat =

Pixel formats

1019
RGBFormat =
1020
RGBAFormat =
1021
LuminanceFormat =
1022
LuminanceAlphaFormat =
1023
RGBEFormat =

RGBEFormat handled as RGBAFormat in shaders

RGBAFormat
RGB_S3TC_DXT1_Format =

DDS / ST3C Compressed texture formats

2001
RGBA_S3TC_DXT1_Format =
2002
RGBA_S3TC_DXT3_Format =
2003
RGBA_S3TC_DXT5_Format =
2004
RGB_PVRTC_4BPPV1_Format =

PVRTC compressed texture formats

2100
RGB_PVRTC_2BPPV1_Format =
2101
RGBA_PVRTC_4BPPV1_Format =
2102
RGBA_PVRTC_2BPPV1_Format =
2103
LineStrip =
0
LinePieces =
1
ColorKeywords =
{
  'aliceblue' => 0xF0F8FF,
  'antiquewhite' => 0xFAEBD7,
  'aqua' => 0x00FFFF,
  'aquamarine' => 0x7FFFD4,
  'azure' => 0xF0FFFF,
  'beige' => 0xF5F5DC,
  'bisque' => 0xFFE4C4,
  'black' => 0x000000,
  'blanchedalmond' => 0xFFEBCD,
  'blue' => 0x0000FF,
  'blueviolet' => 0x8A2BE2,
  'brown' => 0xA52A2A,
  'burlywood' => 0xDEB887,
  'cadetblue' => 0x5F9EA0,
  'chartreuse' => 0x7FFF00,
  'chocolate' => 0xD2691E,
  'coral' => 0xFF7F50,
  'cornflowerblue' => 0x6495ED,
  'cornsilk' => 0xFFF8DC,
  'crimson' => 0xDC143C,
  'cyan' => 0x00FFFF,
  'darkblue' => 0x00008B,
  'darkcyan' => 0x008B8B,
  'darkgoldenrod' => 0xB8860B,
  'darkgray' => 0xA9A9A9,
  'darkgreen' => 0x006400,
  'darkgrey' => 0xA9A9A9,
  'darkkhaki' => 0xBDB76B,
  'darkmagenta' => 0x8B008B,
  'darkolivegreen' => 0x556B2F,
  'darkorange' => 0xFF8C00,
  'darkorchid' => 0x9932CC,
  'darkred' => 0x8B0000,
  'darksalmon' => 0xE9967A,
  'darkseagreen' => 0x8FBC8F,
  'darkslateblue' => 0x483D8B,
  'darkslategray' => 0x2F4F4F,
  'darkslategrey' => 0x2F4F4F,
  'darkturquoise' => 0x00CED1,
  'darkviolet' => 0x9400D3,
  'deeppink' => 0xFF1493,
  'deepskyblue' => 0x00BFFF,
  'dimgray' => 0x696969,
  'dimgrey' => 0x696969,
  'dodgerblue' => 0x1E90FF,
  'firebrick' => 0xB22222,
  'floralwhite' => 0xFFFAF0,
  'forestgreen' => 0x228B22,
  'fuchsia' => 0xFF00FF,
  'gainsboro' => 0xDCDCDC,
  'ghostwhite' => 0xF8F8FF,
  'gold' => 0xFFD700,
  'goldenrod' => 0xDAA520,
  'gray' => 0x808080,
  'green' => 0x008000,
  'greenyellow' => 0xADFF2F,
  'grey' => 0x808080,
  'honeydew' => 0xF0FFF0,
  'hotpink' => 0xFF69B4,
  'indianred' => 0xCD5C5C,
  'indigo' => 0x4B0082,
  'ivory' => 0xFFFFF0,
  'khaki' => 0xF0E68C,
  'lavender' => 0xE6E6FA,
  'lavenderblush' => 0xFFF0F5,
  'lawngreen' => 0x7CFC00,
  'lemonchiffon' => 0xFFFACD,
  'lightblue' => 0xADD8E6,
  'lightcoral' => 0xF08080,
  'lightcyan' => 0xE0FFFF,
  'lightgoldenrodyellow' => 0xFAFAD2,
  'lightgray' => 0xD3D3D3,
  'lightgreen' => 0x90EE90,
  'lightgrey' => 0xD3D3D3,
  'lightpink' => 0xFFB6C1,
  'lightsalmon' => 0xFFA07A,
  'lightseagreen' => 0x20B2AA,
  'lightskyblue' => 0x87CEFA,
  'lightslategray' => 0x778899,
  'lightslategrey' => 0x778899,
  'lightsteelblue' => 0xB0C4DE,
  'lightyellow' => 0xFFFFE0,
  'lime' => 0x00FF00,
  'limegreen' => 0x32CD32,
  'linen' => 0xFAF0E6,
  'magenta' => 0xFF00FF,
  'maroon' => 0x800000,
  'mediumaquamarine' => 0x66CDAA,
  'mediumblue' => 0x0000CD,
  'mediumorchid' => 0xBA55D3,
  'mediumpurple' => 0x9370DB,
  'mediumseagreen' => 0x3CB371,
  'mediumslateblue' => 0x7B68EE,
  'mediumspringgreen' => 0x00FA9A,
  'mediumturquoise' => 0x48D1CC,
  'mediumvioletred' => 0xC71585,
  'midnightblue' => 0x191970,
  'mintcream' => 0xF5FFFA,
  'mistyrose' => 0xFFE4E1,
  'moccasin' => 0xFFE4B5,
  'navajowhite' => 0xFFDEAD,
  'navy' => 0x000080,
  'oldlace' => 0xFDF5E6,
  'olive' => 0x808000,
  'olivedrab' => 0x6B8E23,
  'orange' => 0xFFA500,
  'orangered' => 0xFF4500,
  'orchid' => 0xDA70D6,
  'palegoldenrod' => 0xEEE8AA,
  'palegreen' => 0x98FB98,
  'paleturquoise' => 0xAFEEEE,
  'palevioletred' => 0xDB7093,
  'papayawhip' => 0xFFEFD5,
  'peachpuff' => 0xFFDAB9,
  'peru' => 0xCD853F,
  'pink' => 0xFFC0CB,
  'plum' => 0xDDA0DD,
  'powderblue' => 0xB0E0E6,
  'purple' => 0x800080,
  'red' => 0xFF0000,
  'rosybrown' => 0xBC8F8F,
  'royalblue' => 0x4169E1,
  'saddlebrown' => 0x8B4513,
  'salmon' => 0xFA8072,
  'sandybrown' => 0xF4A460,
  'seagreen' => 0x2E8B57,
  'seashell' => 0xFFF5EE,
  'sienna' => 0xA0522D,
  'silver' => 0xC0C0C0,
  'skyblue' => 0x87CEEB,
  'slateblue' => 0x6A5ACD,
  'slategray' => 0x708090,
  'slategrey' => 0x708090,
  'snow' => 0xFFFAFA,
  'springgreen' => 0x00FF7F,
  'steelblue' => 0x4682B4,
  'tan' => 0xD2B48C,
  'teal' => 0x008080,
  'thistle' => 0xD8BFD8,
  'tomato' => 0xFF6347,
  'turquoise' => 0x40E0D0,
  'violet' => 0xEE82EE,
  'wheat' => 0xF5DEB3,
  'white' => 0xFFFFFF,
  'whitesmoke' => 0xF5F5F5,
  'yellow' => 0xFFFF00,
  'yellowgreen' => 0x9ACD32
}
DefaultLoadingManager =
LoadingManager.new
ShaderLib =
{
  basic: ShaderLib_Instance.new(
    uniforms: UniformsUtils.merge([
      UniformsLib[:common],
      UniformsLib[:fog],
      UniformsLib[:shadowmap]
    ]),

    vertex_shader: [
      ShaderChunk[:common],
      ShaderChunk[:map_pars_vertex],
      ShaderChunk[:lightmap_pars_vertex],
      ShaderChunk[:envmap_pars_vertex],
      ShaderChunk[:color_pars_vertex],
      ShaderChunk[:morphtarget_pars_vertex],
      ShaderChunk[:skinning_pars_vertex],
      ShaderChunk[:shadowmap_pars_vertex],
      ShaderChunk[:logdepthbuf_pars_vertex],

      "void main() {",

        ShaderChunk[:map_vertex],
        ShaderChunk[:lightmap_vertex],
        ShaderChunk[:color_vertex],
        ShaderChunk[:skinbase_vertex],

      "  #ifdef USE_ENVMAP",

        ShaderChunk[:morphnormal_vertex],
        ShaderChunk[:skinnormal_vertex],
        ShaderChunk[:defaultnormal_vertex],

      "  #endif",

        ShaderChunk[:morphtarget_vertex],
        ShaderChunk[:skin_vertex],
        ShaderChunk[:default_vertex],
        ShaderChunk[:logdepthbuf_vertex],

        ShaderChunk[:worldpos_vertex],
        ShaderChunk[:envmap_vertex],
        ShaderChunk[:shadowmap_vertex],

      "}"

    ].join("\n"),

    fragment_shader: [

      "uniform vec3 diffuse;",
      "uniform float opacity;",

      ShaderChunk[:common],
      ShaderChunk[:color_pars_fragment],
      ShaderChunk[:map_pars_fragment],
      ShaderChunk[:alphamap_pars_fragment],
      ShaderChunk[:lightmap_pars_fragment],
      ShaderChunk[:envmap_pars_fragment],
      ShaderChunk[:fog_pars_fragment],
      ShaderChunk[:shadowmap_pars_fragment],
      ShaderChunk[:specularmap_pars_fragment],
      ShaderChunk[:logdepthbuf_pars_fragment],

      "void main() {",

      "  vec3 outgoingLight = vec3( 0.0 );",  # outgoing light does not have an alpha, the surface does
      "  vec4 diffuseColor = vec4( diffuse, opacity );",

        ShaderChunk[:logdepthbuf_fragment],
        ShaderChunk[:map_fragment],
        ShaderChunk[:color_fragment],
        ShaderChunk[:alphamap_fragment],
        ShaderChunk[:alphatest_fragment],
        ShaderChunk[:specularmap_fragment],

      "  outgoingLight = diffuseColor.rgb;", # simple shader

        ShaderChunk[:lightmap_fragment],    # TODO: Light map on an otherwise unlit surface doesn't make sense.
        ShaderChunk[:envmap_fragment],
        ShaderChunk[:shadowmap_fragment],    # TODO: Shadows on an otherwise unlit surface doesn't make sense.

        ShaderChunk[:linear_to_gamma_fragment],

        ShaderChunk[:fog_fragment],

      "  fragColor = vec4( outgoingLight, diffuseColor.a );",  # TODO, this should be pre-multiplied to allow for bright highlights on very transparent objects

      "}"

    ].join("\n")
  ),
  lambert: ShaderLib_Instance.new(
    uniforms: UniformsUtils.merge([
      UniformsLib[:common],
      UniformsLib[:fog],
      UniformsLib[:lights],
      UniformsLib[:shadow_map],
      {
        'emissive' => Uniform.new(:c, Color.new(0x000000)),
        'wrapRGB' => Uniform.new(:v3, Vector3.new(1.0, 1.0, 1.0))
      }
    ]),
    vertex_shader: [
      '#define LAMBERT',
      'out vec3 vLightFront;',
      '#ifdef DOUBLE_SIDED',
      '  out vec3 vLightBack;',
      '#endif',
      ShaderChunk[:common],
      ShaderChunk[:map_pars_vertex],
      ShaderChunk[:lightmap_pars_vertex],
      ShaderChunk[:envmap_pars_vertex],
      ShaderChunk[:lights_lambert_pars_vertex],
      ShaderChunk[:color_pars_vertex],
      ShaderChunk[:morphtarget_pars_vertex],
      ShaderChunk[:skinning_pars_vertex],
      ShaderChunk[:shadowmap_pars_vertex],
      ShaderChunk[:logdepthbuf_pars_vertex],
      'void main() {',

        ShaderChunk[:map_vertex],
        ShaderChunk[:lightmap_vertex],
        ShaderChunk[:color_vertex],

        ShaderChunk[:morphnormal_vertex],
        ShaderChunk[:skinbase_vertex],
        ShaderChunk[:skinnormal_vertex],
        ShaderChunk[:defaultnormal_vertex],

        ShaderChunk[:morphtarget_vertex],
        ShaderChunk[:skinning_vertex],
        ShaderChunk[:default_vertex],
        ShaderChunk[:logdepthbuf_vertex],

        ShaderChunk[:worldpos_vertex],
        ShaderChunk[:envmap_vertex],
        ShaderChunk[:lights_lambert_vertex],
        ShaderChunk[:shadowmap_vertex],

      '}',
    ].join("\n"),
    fragment_shader: [
      'uniform vec3 diffuse;',
      'uniform vec3 emissive;',
      'uniform float opacity;',

      'in vec3 vLightFront;',

      '#ifdef DOUBLE_SIDED',
      '  in vec3 vLightBack;',
      '#endif',

      ShaderChunk[:common],
      ShaderChunk[:color_pars_fragment],
      ShaderChunk[:map_pars_fragment],
      ShaderChunk[:alphamap_pars_fragment],
      ShaderChunk[:lightmap_pars_fragment],
      ShaderChunk[:envmap_pars_fragment],
      ShaderChunk[:fog_pars_fragment],
      ShaderChunk[:shadowmap_pars_fragment],
      ShaderChunk[:specularmap_pars_fragment],
      ShaderChunk[:logdepthbuf_pars_fragment],

      'void main() {',

      '  vec3 outgoingLight = vec3( 0.0 );',  # outgoing light does not have an alpha, the surface does
      '  vec4 diffuseColor = vec4( diffuse, opacity );',

        ShaderChunk[:logdepthbuf_fragment],
        ShaderChunk[:map_fragment],
        ShaderChunk[:color_fragment],
        ShaderChunk[:alphamap_fragment],
        ShaderChunk[:alphatest_fragment],
        ShaderChunk[:specularmap_fragment],

      '  #ifdef DOUBLE_SIDED',

          #'float isFront = float( gl_FrontFacing );',
          #'fragColor.xyz *= isFront * vLightFront + ( 1.0 - isFront ) * vLightBack;',

      '    if ( gl_FrontFacing )',
      '      outgoingLight += diffuseColor.rgb * vLightFront + emissive;',
      '    else',
      '      outgoingLight += diffuseColor.rgb * vLightBack + emissive;',

      '  #else',

      '    outgoingLight += diffuseColor.rgb * vLightFront + emissive;',

      '  #endif',

        ShaderChunk[:lightmap_fragment],
        ShaderChunk[:envmap_fragment],
        ShaderChunk[:shadowmap_fragment],

        ShaderChunk[:linear_to_gamma_fragment],

        ShaderChunk[:fog_fragment],

      # '  fragColor = vec4( outgoingLight, diffuseColor.a );',  # TODO, this should be pre-multiplied to allow for bright highlights on very transparent objects

      '  fragColor = vec4(outgoingLight, diffuseColor.a);',
      '}'
    ].join("\n")
  ),
  phong: ShaderLib_Instance.new(
    uniforms: UniformsUtils.merge([
      UniformsLib[:common],
      UniformsLib[:bump],
      UniformsLib[:normal_map],
      UniformsLib[:fog],
      UniformsLib[:lights],
      UniformsLib[:shadow_map],
      {
        'emissive'  => Uniform.new(:c, Color.new(0x000000)),
        'specular'  => Uniform.new(:c, Color.new(0x111111)),
        'shininess' => Uniform.new(:f, 30.0),
        'wrapRGB'   => Uniform.new(:v3, Vector3.new(1.0, 1.0, 1.0))
      }
    ]),
    vertex_shader: [
      '#define PHONG',
      'out vec3 vViewPosition;',
      '#ifndef FLAT_SHADED',
      '  out vec3 vNormal;',
      '#endif',

      ShaderChunk[:common],
      ShaderChunk[:map_pars_vertex],
      ShaderChunk[:lightmap_pars_vertex],
      ShaderChunk[:envmap_pars_vertex],
      ShaderChunk[:lights_phong_pars_vertex],
      ShaderChunk[:color_pars_vertex],
      ShaderChunk[:morphtarget_pars_vertex],
      ShaderChunk[:skinning_pars_vertex],
      ShaderChunk[:shadowmap_pars_vertex],
      ShaderChunk[:logdepthbuf_pars_vertex],

      'void main() {',

        ShaderChunk[:map_vertex],
        ShaderChunk[:lightmap_vertex],
        ShaderChunk[:color_vertex],

        ShaderChunk[:morphnormal_vertex],
        ShaderChunk[:skinbase_vertex],
        ShaderChunk[:skinnormal_vertex],
        ShaderChunk[:defaultnormal_vertex],

      '#ifndef FLAT_SHADED', # Normal computed with derivatives when FLAT_SHADED
      '  vNormal = normalize( transformedNormal );',
      '#endif',

        ShaderChunk[:morphtarget_vertex],
        ShaderChunk[:skinning_vertex],
        ShaderChunk[:default_vertex],
        ShaderChunk[:logdepthbuf_vertex],

      '  vViewPosition = -mvPosition.xyz;',

        ShaderChunk[:worldpos_vertex],
        ShaderChunk[:envmap_vertex],
        ShaderChunk[:lights_phong_vertex],
        ShaderChunk[:shadowmap_vertex],
      '}'
    ].join("\n"),
    fragment_shader: [
      '#define PHONG',

      'uniform vec3 diffuse;',
      'uniform vec3 emissive;',
      'uniform vec3 specular;',
      'uniform float shininess;',
      'uniform float opacity;',

      ShaderChunk[:common],
      ShaderChunk[:color_pars_fragment],
      ShaderChunk[:map_pars_fragment],
      ShaderChunk[:alphamap_pars_fragment],
      ShaderChunk[:lightmap_pars_fragment],
      ShaderChunk[:envmap_pars_fragment],
      ShaderChunk[:fog_pars_fragment],
      ShaderChunk[:lights_phong_pars_fragment],
      ShaderChunk[:shadowmap_pars_fragment],
      ShaderChunk[:bumpmap_pars_fragment],
      ShaderChunk[:normalmap_pars_fragment],
      ShaderChunk[:specularmap_pars_fragment],
      ShaderChunk[:logdepthbuf_pars_fragment],

      'void main() {',

      '  vec3 outgoingLight = vec3( 0.0 );',  # outgoing light does not have an alpha, the surface does
      '  vec4 diffuseColor = vec4( diffuse, opacity );',

        ShaderChunk[:logdepthbuf_fragment],
        ShaderChunk[:map_fragment],
        ShaderChunk[:color_fragment],
        ShaderChunk[:alphamap_fragment],
        ShaderChunk[:alphatest_fragment],
        ShaderChunk[:specularmap_fragment],

        ShaderChunk[:lights_phong_fragment],

        ShaderChunk[:lightmap_fragment],
        ShaderChunk[:envmap_fragment],
        ShaderChunk[:shadowmap_fragment],

        ShaderChunk[:linear_to_gamma_fragment],

        ShaderChunk[:fog_fragment],

      '  fragColor = vec4( outgoingLight, diffuseColor.a );',  # TODO, this should be pre-multiplied to allow for bright highlights on very transparent objects

      '}'
    ].join("\n")
  ),
  # TODO:
  # particle_basic
  # dashed
  # depth
  # normal
  cube: ShaderLib_Instance.new(
    uniforms: {
      'tCube' => Uniform.new(:t, nil),
      'tFlip' => Uniform.new(:f, -1.0)
    },
    vertex_shader: [
      'out vec3 vWorldPosition;',

      ShaderChunk[:common],
      ShaderChunk[:logdepthbuf_pars_vertex],

      'void main() {',
      '  vWorldPosition = transformDirection( position, modelMatrix );',
      '  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',
        ShaderChunk[:logdepthbuf_vertex],
      '}'
    ].join("\n"),
    fragment_shader: [
      'uniform samplerCube tCube;',
      'uniform float tFlip;',

      'in vec3 vWorldPosition;',

      ShaderChunk[:common],
      ShaderChunk[:logdepthbuf_pars_fragment],

      'void main() {',
      '  fragColor = texture( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );',
        ShaderChunk[:logdepthbuf_fragment],
      '}'
    ].join("\n")
  ),
  # equirect
  depth_rgba: ShaderLib_Instance.new(
    uniforms: {},
    vertex_shader: [
      ShaderChunk[:common],
      ShaderChunk[:morphtarget_pars_vertex],
      ShaderChunk[:skinning_pars_vertex],
      ShaderChunk[:logdepthbuf_pars_vertex],

      'void main() {',
        ShaderChunk[:skinbase_vertex],
        ShaderChunk[:morphtarget_vertex],
        ShaderChunk[:skinning_vertex],
        ShaderChunk[:default_vertex],
        ShaderChunk[:logdepthbuf_vertex],
      '}'
    ].join("\n"),
    fragment_shader: [
      ShaderChunk[:common],
      ShaderChunk[:logdepthbuf_pars_fragment],

      'vec4 pack_depth( const in float depth ) {',

      '  const vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );',
      '  const vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );',
      '  vec4 res = mod( depth * bit_shift * vec4( 255 ), vec4( 256 ) ) / vec4( 255 );', # '  vec4 res = fract( depth * bit_shift );',
      '  res -= res.xxyz * bit_mask;',
      '  return res;',

      '}',

      'void main() {',
        ShaderChunk[:logdepthbuf_fragment],

      '  #ifdef USE_LOGDEPTHBUF_EXT',

      '    fragColor   = pack_depth( gl_FragDepthEXT );',

      '  #else',

      '    fragColor = pack_depth( gl_FragCoord.z );',

      '  #endif',

        #'fragColor = pack_depth( gl_FragCoord.z / gl_FragCoord.w );',
        #'float z = ( ( gl_FragCoord.z / gl_FragCoord.w ) - 3.0 ) / ( 4000.0 - 3.0 );',
        #'fragColor = pack_depth( z );',
        #'fragColor = vec4( z, z, z, 1.0 );',
      '}'
    ].join("\n")
  )
}
ShaderChunk =
{}.tap do |chunks|
  Dir.new(File.join(__dir__, 'shader_chunk')).each do |file_name|
    next unless file_name.end_with? '.glsl'
    file_path = File.join(__dir__, 'shader_chunk', file_name)
    chunk_name = File.basename(file_name, '.glsl')
    chunk = File.read(file_path)
    # chunk = "// #{chunk_name}\n#{chunk}"
    chunks[chunk_name.to_sym] = chunk
  end
end
UniformsLib =
{
  common: {
    'diffuse' => Uniform.new(:c, Color.new(0xeeeeee)),
    'opacity' => Uniform.new(:f, 1.0),

    'map' => Uniform.new(:t, nil),
    'offsetRepeat' => Uniform.new(:v4, Vector4.new(0.0, 0.0, 1.0, 1.0)),

    'lightMap' => Uniform.new(:t, nil),
    'specularMap' => Uniform.new(:t, nil),
    'alphaMap' => Uniform.new(:t, nil),

    'envMap' => Uniform.new(:t, nil),
    'flipEnvMap' => Uniform.new(:f, -1.0),
    'reflectivity' => Uniform.new(:f, 1.0),
    'refractionRatio' => Uniform.new(:f, 0.98),

    'morphTargetInfluences' => Uniform.new(:f, 0.0)
  },

  bump: {
    'bumpMap' => Uniform.new(:t, nil),
    'bumpScale' => Uniform.new(:f, 1.0)
  },

	normal_map: {
		'normalMap' => Uniform.new(:t, nil),
		'normalScale' => Uniform.new(:v2, Vector2.new(1.0, 1.0))
	},

  fog: {
    'fogDensity' => Uniform.new(:f, 0.00025),
    'fogNear' => Uniform.new(:f, 1.0),
    'fogFar' => Uniform.new(:f, 2000.0),
    'fogColor' => Uniform.new(:c, Color.new(0xffffff))
  },

  lights: {
    'ambientLightColor' => Uniform.new(:fv, []),

    'directionalLightDirection' => Uniform.new(:fv, []),
    'directionalLightColor' => Uniform.new(:fv, []),

    'hemisphereLightDirection' => Uniform.new(:fv, []),
    'hemisphereLightSkyColor' => Uniform.new(:fv, []),
    'hemisphereLightGroundColor' => Uniform.new(:fv, []),

    'pointLightColor' => Uniform.new(:fv, []),
    'pointLightPosition' => Uniform.new(:fv, []),
    'pointLightDistance' => Uniform.new(:fv1, []),
    'pointLightDecay' => Uniform.new(:fv1, []),

    'spotLightColor' => Uniform.new(:fv, []),
    'spotLightPosition' => Uniform.new(:fv, []),
    'spotLightDirection' => Uniform.new(:fv, []),
    'spotLightDistance' => Uniform.new(:fv, []),
    'spotLightAngleCos' => Uniform.new(:fv, []),
    'spotLightExponent' => Uniform.new(:fv, []),
    'spotLightDecay' => Uniform.new(:fv, [])
  },

  particle: {
    'psColor' => Uniform.new(:c, Color.new(0xeeeeee)),
    'opacity' => Uniform.new(:f, 1.0),
    'size' => Uniform.new(:f, 1.0),
    'scale' => Uniform.new(:f, 1.0),
    'map' => Uniform.new(:t, nil),
    'offsetRepeat' => Uniform.new(:v4, Vector4.new(0.0, 0.0, 1.0, 1.0))
  },

  shadow_map: {
    'shadowMap' => Uniform.new(:tv, []),
    'shadowMapSize' => Uniform.new(:v2v, []),

    'shadowBias' => Uniform.new(:fv1, []),
    'shadowDarkness' => Uniform.new(:fv1, []),

    'shadowMatrix' => Uniform.new(:m4v, [])
  }
}

Instance Attribute Summary collapse

Instance Attribute Details

#alpha_mapObject

Returns the value of attribute alpha_map.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def alpha_map
  @alpha_map
end

#colorObject

Returns the value of attribute color.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def color
  @color
end

#combineObject

Returns the value of attribute combine.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def combine
  @combine
end

#env_mapObject

Returns the value of attribute env_map.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def env_map
  @env_map
end

#fogObject

Returns the value of attribute fog.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def fog
  @fog
end

#light_mapObject

Returns the value of attribute light_map.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def light_map
  @light_map
end

#mapObject

Returns the value of attribute map.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def map
  @map
end

#morph_targetsObject

Returns the value of attribute morph_targets.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def morph_targets
  @morph_targets
end

#reflectivityObject

Returns the value of attribute reflectivity.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def reflectivity
  @reflectivity
end

#refraction_ratioObject

Returns the value of attribute refraction_ratio.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def refraction_ratio
  @refraction_ratio
end

#shadingObject

Returns the value of attribute shading.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def shading
  @shading
end

#skinningObject

Returns the value of attribute skinning.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def skinning
  @skinning
end

#specular_mapObject

Returns the value of attribute specular_map.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def specular_map
  @specular_map
end

#vertex_colorsObject

Returns the value of attribute vertex_colors.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def vertex_colors
  @vertex_colors
end

#wireframeObject

Returns the value of attribute wireframe.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def wireframe
  @wireframe
end

#wireframe_linecapObject

Returns the value of attribute wireframe_linecap.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def wireframe_linecap
  @wireframe_linecap
end

#wireframe_linejoinObject

Returns the value of attribute wireframe_linejoin.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def wireframe_linejoin
  @wireframe_linejoin
end

#wireframe_linewidthObject

Returns the value of attribute wireframe_linewidth.



36
37
38
# File 'lib/mittsu/materials/mesh_basic_material.rb', line 36

def wireframe_linewidth
  @wireframe_linewidth
end