提交 5a87757b 编写于 作者: A alteredq

Merge remote-tracking branch 'remotes/mrdoob/dev' into dev

因为 它太大了无法显示 source diff 。你可以改为 查看blob
此差异已折叠。
此差异已折叠。
此差异已折叠。
因为 它太大了无法显示 source diff 。你可以改为 查看blob
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>three.js - webgl</title>
<meta charset="utf-8">
<style type="text/css">
body {
background:#fff;
padding:0;
margin:0;
overflow:hidden;
}
</style>
</head>
<body>
<script type="text/javascript" src="../build/Three.js"></script>
<script type="text/javascript">
var container;
var camera, scene, renderer;
init();
setInterval( render, 1000 / 60 );
function init() {
container = document.createElement( 'div' );
document.body.appendChild( container );
camera = new THREE.Camera( 60, window.innerWidth / window.innerHeight, 1, 10000 );
camera.position.z = 200;
scene = new THREE.Scene();
renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
container.appendChild( renderer.domElement );
}
function createImage() {
var canvas = document.createElement( 'canvas' );
canvas.width = 256;
canvas.height = 256;
var context = canvas.getContext( '2d' );
context.fillStyle = 'rgb(' + Math.floor( Math.random() * 256 ) + ',' + Math.floor( Math.random() * 256 ) + ',' + Math.floor( Math.random() * 256 ) + ')';
context.fillRect( 0, 0, 256, 256 );
return canvas;
}
//
function animate() {
requestAnimationFrame( animate );
render();
}
function render() {
var geometry = new THREE.SphereGeometry( 50, Math.random() * 64, Math.random() * 32 );
var texture = new THREE.Texture( createImage() );
texture.needsUpdate = true;
var material = new THREE.MeshBasicMaterial( { map: texture, wireframe: true } )
var mesh = new THREE.Mesh( geometry, material );
scene.addObject( mesh );
renderer.render( scene, camera );
scene.removeObject( mesh );
renderer.deallocateObject( mesh );
renderer.deallocateTexture( texture );
}
</script>
</body>
</html>
......@@ -7,7 +7,7 @@
THREE.Geometry = function () {
this.id = "Geometry" + THREE.GeometryIdCounter ++;
this.id = THREE.GeometryCount ++;
this.vertices = [];
this.colors = []; // one-to-one vertex colors, used in ParticleSystem, Line and Ribbon
......@@ -510,4 +510,4 @@ THREE.Geometry.prototype = {
};
THREE.GeometryIdCounter = 0;
THREE.GeometryCount = 0;
......@@ -6,6 +6,8 @@
THREE.Object3D = function() {
this.id = THREE.Object3DCount ++;
this.parent = undefined;
this.children = [];
......@@ -233,3 +235,5 @@ THREE.Object3D.prototype = {
}
};
THREE.Object3DCount = 0;
......@@ -12,6 +12,8 @@ THREE.Projector = function() {
_line, _lineCount, _linePool = [],
_particle, _particleCount, _particlePool = [],
_objectList = [], _renderList = [],
_vector3 = new THREE.Vector4(),
_vector4 = new THREE.Vector4(),
_projScreenMatrix = new THREE.Matrix4(),
......@@ -52,9 +54,9 @@ THREE.Projector = function() {
this.projectObjects = function ( scene, camera, sort ) {
var renderList = [],
o, ol, objects, object, matrix;
var o, ol, objects, object, matrix;
_objectList.length = 0;
_objectCount = 0;
objects = scene.objects;
......@@ -73,13 +75,13 @@ THREE.Projector = function() {
_object.object = object;
_object.z = _vector3.z;
renderList.push( _object );
_objectList.push( _object );
}
sort && renderList.sort( painterSort );
sort && _objectList.sort( painterSort );
return renderList;
return _objectList;
};
......@@ -87,13 +89,15 @@ THREE.Projector = function() {
this.projectScene = function ( scene, camera, sort ) {
var renderList = [], near = camera.near, far = camera.far,
var near = camera.near, far = camera.far,
o, ol, v, vl, f, fl, n, nl, c, cl, u, ul, objects, object,
objectMatrix, objectMatrixRotation, objectMaterials, objectOverdraw,
geometry, vertices, vertex, vertexPositionScreen,
faces, face, faceVertexNormals, normal, faceVertexUvs, uvs,
v1, v2, v3, v4;
_renderList.length = 0;
_face3Count = 0;
_face4Count = 0;
_lineCount = 0;
......@@ -241,7 +245,7 @@ THREE.Projector = function() {
_face.z = _face.centroidScreen.z;
renderList.push( _face );
_renderList.push( _face );
}
......@@ -280,7 +284,7 @@ THREE.Projector = function() {
_line.materials = object.materials;
renderList.push( _line );
_renderList.push( _line );
}
}
......@@ -306,7 +310,7 @@ THREE.Projector = function() {
_particle.materials = object.materials;
renderList.push( _particle );
_renderList.push( _particle );
}
......@@ -314,9 +318,9 @@ THREE.Projector = function() {
}
sort && renderList.sort( painterSort );
sort && _renderList.sort( painterSort );
return renderList;
return _renderList;
};
......
......@@ -296,6 +296,53 @@ THREE.WebGLRenderer = function ( parameters ) {
};
this.deallocateObject = function ( object ) {
if ( ! object.__webglInit ) return;
object.__webglInit = false;
delete object._modelViewMatrix;
delete object._normalMatrixArray;
delete object._modelViewMatrixArray;
delete object._objectMatrixArray;
if ( object instanceof THREE.Mesh ) {
for ( g in object.geometry.geometryGroups ) {
deleteMeshBuffers( object.geometry.geometryGroups[ g ] );
}
} else if ( object instanceof THREE.Ribbon ) {
deleteRibbonBuffers( object.geometry );
} else if ( object instanceof THREE.Line ) {
deleteLineBuffers( object.geometry );
} else if ( object instanceof THREE.ParticleSystem ) {
deleteParticleBuffers( object.geometry );
}
};
this.deallocateTexture = function ( texture ) {
if ( ! texture.__webglInit ) return;
texture.__webglInit = false;
_gl.deleteTexture( texture.__webglTexture );
};
//
function setupLights ( program, lights ) {
var l, ll, light, n,
......@@ -397,7 +444,9 @@ THREE.WebGLRenderer = function ( parameters ) {
};
function createParticleBuffers ( geometry ) {
// Buffer allocation
function createParticleBuffers( geometry ) {
geometry.__webglVertexBuffer = _gl.createBuffer();
geometry.__webglColorBuffer = _gl.createBuffer();
......@@ -451,6 +500,60 @@ THREE.WebGLRenderer = function ( parameters ) {
};
// Buffer deallocation
function deleteParticleBuffers( geometry ) {
_gl.deleteBuffer( geometry.__webglVertexBuffer );
_gl.deleteBuffer( geometry.__webglColorBuffer );
};
function deleteLineBuffers( geometry ) {
_gl.deleteBuffer( geometry.__webglVertexBuffer );
_gl.deleteBuffer( geometry.__webglColorBuffer );
};
function deleteRibbonBuffers( geometry ) {
_gl.deleteBuffer( geometry.__webglVertexBuffer );
_gl.deleteBuffer( geometry.__webglColorBuffer );
};
function deleteMeshBuffers( geometryGroup ) {
_gl.deleteBuffer( geometryGroup.__webglVertexBuffer );
_gl.deleteBuffer( geometryGroup.__webglNormalBuffer );
_gl.deleteBuffer( geometryGroup.__webglTangentBuffer );
_gl.deleteBuffer( geometryGroup.__webglColorBuffer );
_gl.deleteBuffer( geometryGroup.__webglUVBuffer );
_gl.deleteBuffer( geometryGroup.__webglUV2Buffer );
_gl.deleteBuffer( geometryGroup.__webglSkinVertexABuffer );
_gl.deleteBuffer( geometryGroup.__webglSkinVertexBBuffer );
_gl.deleteBuffer( geometryGroup.__webglSkinIndicesBuffer );
_gl.deleteBuffer( geometryGroup.__webglSkinWeightsBuffer );
_gl.deleteBuffer( geometryGroup.__webglFaceBuffer );
_gl.deleteBuffer( geometryGroup.__webglLineBuffer );
if ( geometryGroup.numMorphTargets ) {
for ( var m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) {
_gl.deleteBuffer( geometryGroup.__webglMorphTargetsBuffers[ m ] );
}
}
};
//
function initLineBuffers ( geometry ) {
var nvertices = geometry.vertices.length;
......@@ -3966,7 +4069,9 @@ THREE.WebGLRenderer = function ( parameters ) {
var g, geometry, geometryGroup;
if ( object._modelViewMatrix == undefined ) {
if ( ! object.__webglInit ) {
object.__webglInit = true;
object._modelViewMatrix = new THREE.Matrix4();
......@@ -3976,106 +4081,107 @@ THREE.WebGLRenderer = function ( parameters ) {
object.matrixWorld.flattenToArray( object._objectMatrixArray );
}
if ( object instanceof THREE.Mesh ) {
if ( object instanceof THREE.Mesh ) {
geometry = object.geometry;
geometry = object.geometry;
if ( geometry.geometryGroups == undefined ) {
if ( geometry.geometryGroups == undefined ) {
sortFacesByMaterial( geometry );
sortFacesByMaterial( geometry );
}
}
// create separate VBOs per geometry chunk
// create separate VBOs per geometry chunk
for ( g in geometry.geometryGroups ) {
for ( g in geometry.geometryGroups ) {
geometryGroup = geometry.geometryGroups[ g ];
geometryGroup = geometry.geometryGroups[ g ];
// initialise VBO on the first access
// initialise VBO on the first access
if ( ! geometryGroup.__webglVertexBuffer ) {
if ( ! geometryGroup.__webglVertexBuffer ) {
createMeshBuffers( geometryGroup );
initMeshBuffers( geometryGroup, object );
createMeshBuffers( geometryGroup );
initMeshBuffers( geometryGroup, object );
geometry.__dirtyVertices = true;
geometry.__dirtyMorphTargets = true;
geometry.__dirtyElements = true;
geometry.__dirtyUvs = true;
geometry.__dirtyNormals = true;
geometry.__dirtyTangents = true;
geometry.__dirtyColors = true;
geometry.__dirtyVertices = true;
geometry.__dirtyMorphTargets = true;
geometry.__dirtyElements = true;
geometry.__dirtyUvs = true;
geometry.__dirtyNormals = true;
geometry.__dirtyTangents = true;
geometry.__dirtyColors = true;
}
}
addBuffer( scene.__webglObjects, geometryGroup, object );
addBuffer( scene.__webglObjects, geometryGroup, object );
}
}
} else if ( object instanceof THREE.Ribbon ) {
} else if ( object instanceof THREE.Ribbon ) {
geometry = object.geometry;
geometry = object.geometry;
if( ! geometry.__webglVertexBuffer ) {
if( ! geometry.__webglVertexBuffer ) {
createRibbonBuffers( geometry );
initRibbonBuffers( geometry );
createRibbonBuffers( geometry );
initRibbonBuffers( geometry );
geometry.__dirtyVertices = true;
geometry.__dirtyColors = true;
geometry.__dirtyVertices = true;
geometry.__dirtyColors = true;
}
}
addBuffer( scene.__webglObjects, geometry, object );
addBuffer( scene.__webglObjects, geometry, object );
} else if ( object instanceof THREE.Line ) {
} else if ( object instanceof THREE.Line ) {
geometry = object.geometry;
geometry = object.geometry;
if( ! geometry.__webglVertexBuffer ) {
if( ! geometry.__webglVertexBuffer ) {
createLineBuffers( geometry );
initLineBuffers( geometry );
createLineBuffers( geometry );
initLineBuffers( geometry );
geometry.__dirtyVertices = true;
geometry.__dirtyColors = true;
geometry.__dirtyVertices = true;
geometry.__dirtyColors = true;
}
}
addBuffer( scene.__webglObjects, geometry, object );
addBuffer( scene.__webglObjects, geometry, object );
} else if ( object instanceof THREE.ParticleSystem ) {
} else if ( object instanceof THREE.ParticleSystem ) {
geometry = object.geometry;
geometry = object.geometry;
if ( ! geometry.__webglVertexBuffer ) {
if ( ! geometry.__webglVertexBuffer ) {
createParticleBuffers( geometry );
initParticleBuffers( geometry, object );
createParticleBuffers( geometry );
initParticleBuffers( geometry, object );
geometry.__dirtyVertices = true;
geometry.__dirtyColors = true;
geometry.__dirtyVertices = true;
geometry.__dirtyColors = true;
}
}
addBuffer( scene.__webglObjects, geometry, object );
addBuffer( scene.__webglObjects, geometry, object );
} else if ( THREE.MarchingCubes !== undefined && object instanceof THREE.MarchingCubes ) {
} else if ( THREE.MarchingCubes !== undefined && object instanceof THREE.MarchingCubes ) {
addBufferImmediate( scene.__webglObjectsImmediate, object );
addBufferImmediate( scene.__webglObjectsImmediate, object );
} else if ( object instanceof THREE.Sprite ) {
} else if ( object instanceof THREE.Sprite ) {
scene.__webglSprites.push( object );
scene.__webglSprites.push( object );
}
}
/*else if ( object instanceof THREE.Particle ) {
/*else if ( object instanceof THREE.Particle ) {
}*/
}*/
}
};
......@@ -4908,8 +5014,8 @@ THREE.WebGLRenderer = function ( parameters ) {
if ( ! texture.__webglInit ) {
texture.__webglTexture = _gl.createTexture();
texture.__webglInit = true;
texture.__webglTexture = _gl.createTexture();
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册