WebGLRenderStates.js 1.7 KB
Newer Older
1 2 3 4 5 6
/**
 * @author Mugen87 / https://github.com/Mugen87
 */

import { WebGLLights } from './WebGLLights.js';

7
function WebGLRenderState() {
8

9
	var lights = new WebGLLights();
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

	var lightsArray = [];
	var shadowsArray = [];

	function init() {

		lightsArray.length = 0;
		shadowsArray.length = 0;

	}

	function pushLight( light ) {

		lightsArray.push( light );

	}

	function pushShadow( shadowLight ) {

		shadowsArray.push( shadowLight );

	}

	function setupLights( camera ) {

		lights.setup( lightsArray, shadowsArray, camera );

	}

	var state = {
		lightsArray: lightsArray,
		shadowsArray: shadowsArray,

		lights: lights
	};

	return {
		init: init,
		state: state,
		setupLights: setupLights,

		pushLight: pushLight,
52
		pushShadow: pushShadow
53 54 55 56
	};

}

57
function WebGLRenderStates() {
58

59
	var renderStates = new WeakMap();
60

M
Mugen87 已提交
61 62 63 64 65 66
	function onSceneDispose( event ) {

		var scene = event.target;

		scene.removeEventListener( 'dispose', onSceneDispose );

67
		renderStates.delete( scene );
J
Joel 已提交
68

M
Mugen87 已提交
69 70
	}

71 72
	function get( scene, camera ) {

O
oguz 已提交
73
		var renderState;
74

J
Joel 已提交
75
		if ( renderStates.has( scene ) === false ) {
76

77
			renderState = new WebGLRenderState();
J
Joel 已提交
78 79
			renderStates.set( scene, new WeakMap() );
			renderStates.get( scene ).set( camera, renderState );
80

M
Mugen87 已提交
81 82
			scene.addEventListener( 'dispose', onSceneDispose );

83 84
		} else {

J
Joel 已提交
85
			if ( renderStates.get( scene ).has( camera ) === false ) {
86

O
oguz 已提交
87
				renderState = new WebGLRenderState();
J
Joel 已提交
88
				renderStates.get( scene ).set( camera, renderState );
89

O
oguz 已提交
90
			} else {
91

92
				renderState = renderStates.get( scene ).get( camera );
93

O
oguz 已提交
94
			}
95 96 97

		}

98
		return renderState;
99 100 101 102 103

	}

	function dispose() {

104
		renderStates = new WeakMap();
105 106 107 108 109 110 111 112 113 114 115

	}

	return {
		get: get,
		dispose: dispose
	};

}


116
export { WebGLRenderStates };