123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458 |
- /**
- * @author mrdoob / http://mrdoob.com/
- */
- THREE.WebGLBuffers = function ( gl, info, extensions, getBufferMaterial ) {
- function initCustomAttributes( object ) {
- var geometry = object.geometry;
- var material = object.material;
- var nvertices = geometry.vertices.length;
- if ( material.attributes ) {
- if ( geometry.__webglCustomAttributesList === undefined ) {
- geometry.__webglCustomAttributesList = [];
- }
- for ( var name in material.attributes ) {
- var attribute = material.attributes[ name ];
- if ( ! attribute.__webglInitialized || attribute.createUniqueBuffers ) {
- attribute.__webglInitialized = true;
- var size = 1; // "f" and "i"
- if ( attribute.type === 'v2' ) size = 2;
- else if ( attribute.type === 'v3' ) size = 3;
- else if ( attribute.type === 'v4' ) size = 4;
- else if ( attribute.type === 'c' ) size = 3;
- attribute.size = size;
- attribute.array = new Float32Array( nvertices * size );
- attribute.buffer = gl.createBuffer();
- attribute.buffer.belongsToAttribute = name;
- attribute.needsUpdate = true;
- }
- geometry.__webglCustomAttributesList.push( attribute );
- }
- }
- }
- this.initPointCloudBuffers = function ( geometry, object ) {
- if ( geometry.__webglVertexBuffer !== undefined ) return;
- geometry.__webglVertexBuffer = gl.createBuffer();
- geometry.__webglColorBuffer = gl.createBuffer();
- info.memory.geometries ++;
- //
- var nvertices = geometry.vertices.length;
- geometry.__vertexArray = new Float32Array( nvertices * 3 );
- geometry.__colorArray = new Float32Array( nvertices * 3 );
- geometry.__webglParticleCount = nvertices;
- initCustomAttributes( object );
- geometry.verticesNeedUpdate = true;
- geometry.colorsNeedUpdate = true;
- };
- this.initLineBuffers = function ( geometry, object ) {
- if ( geometry.__webglVertexBuffer !== undefined ) return;
- geometry.__webglVertexBuffer = gl.createBuffer();
- geometry.__webglColorBuffer = gl.createBuffer();
- geometry.__webglLineDistanceBuffer = gl.createBuffer();
- info.memory.geometries ++;
- //
- var nvertices = geometry.vertices.length;
- geometry.__vertexArray = new Float32Array( nvertices * 3 );
- geometry.__colorArray = new Float32Array( nvertices * 3 );
- geometry.__lineDistanceArray = new Float32Array( nvertices * 1 );
- geometry.__webglLineCount = nvertices;
- initCustomAttributes( object );
- geometry.verticesNeedUpdate = true;
- geometry.colorsNeedUpdate = true;
- geometry.lineDistancesNeedUpdate = true;
- };
- this.initMeshBuffers = function ( geometryGroup, object ) {
- geometryGroup.__webglVertexBuffer = gl.createBuffer();
- geometryGroup.__webglNormalBuffer = gl.createBuffer();
- geometryGroup.__webglTangentBuffer = gl.createBuffer();
- geometryGroup.__webglColorBuffer = gl.createBuffer();
- geometryGroup.__webglUVBuffer = gl.createBuffer();
- geometryGroup.__webglUV2Buffer = gl.createBuffer();
- geometryGroup.__webglSkinIndicesBuffer = gl.createBuffer();
- geometryGroup.__webglSkinWeightsBuffer = gl.createBuffer();
- geometryGroup.__webglFaceBuffer = gl.createBuffer();
- geometryGroup.__webglLineBuffer = gl.createBuffer();
- var numMorphTargets = geometryGroup.numMorphTargets;
- if ( numMorphTargets ) {
- geometryGroup.__webglMorphTargetsBuffers = [];
- for ( var m = 0, ml = numMorphTargets; m < ml; m ++ ) {
- geometryGroup.__webglMorphTargetsBuffers.push( gl.createBuffer() );
- }
- }
- var numMorphNormals = geometryGroup.numMorphNormals;
- if ( numMorphNormals ) {
- geometryGroup.__webglMorphNormalsBuffers = [];
- for ( var m = 0, ml = numMorphNormals; m < ml; m ++ ) {
- geometryGroup.__webglMorphNormalsBuffers.push( gl.createBuffer() );
- }
- }
- info.memory.geometries ++;
- //
- var geometry = object.geometry,
- faces = geometryGroup.faces,
- nvertices = faces.length * 3,
- ntris = faces.length * 1,
- nlines = faces.length * 3,
- material = getBufferMaterial( object, geometryGroup );
- geometryGroup.__vertexArray = new Float32Array( nvertices * 3 );
- geometryGroup.__normalArray = new Float32Array( nvertices * 3 );
- geometryGroup.__colorArray = new Float32Array( nvertices * 3 );
- geometryGroup.__uvArray = new Float32Array( nvertices * 2 );
- if ( geometry.faceVertexUvs.length > 1 ) {
- geometryGroup.__uv2Array = new Float32Array( nvertices * 2 );
- }
- if ( geometry.hasTangents ) {
- geometryGroup.__tangentArray = new Float32Array( nvertices * 4 );
- }
- if ( object.geometry.skinWeights.length && object.geometry.skinIndices.length ) {
- geometryGroup.__skinIndexArray = new Float32Array( nvertices * 4 );
- geometryGroup.__skinWeightArray = new Float32Array( nvertices * 4 );
- }
- var UintArray = extensions.get( 'OES_element_index_uint' ) !== null && ntris > 21845 ? Uint32Array : Uint16Array; // 65535 / 3
- geometryGroup.__typeArray = UintArray;
- geometryGroup.__faceArray = new UintArray( ntris * 3 );
- geometryGroup.__lineArray = new UintArray( nlines * 2 );
- if ( numMorphTargets ) {
- geometryGroup.__morphTargetsArrays = [];
- for ( var m = 0, ml = numMorphTargets; m < ml; m ++ ) {
- geometryGroup.__morphTargetsArrays.push( new Float32Array( nvertices * 3 ) );
- }
- }
- if ( numMorphNormals ) {
- geometryGroup.__morphNormalsArrays = [];
- for ( var m = 0, ml = numMorphNormals; m < ml; m ++ ) {
- geometryGroup.__morphNormalsArrays.push( new Float32Array( nvertices * 3 ) );
- }
- }
- geometryGroup.__webglFaceCount = ntris * 3;
- geometryGroup.__webglLineCount = nlines * 2;
- // custom attributes
- if ( material.attributes ) {
- if ( geometryGroup.__webglCustomAttributesList === undefined ) {
- geometryGroup.__webglCustomAttributesList = [];
- }
- for ( var name in material.attributes ) {
- // Do a shallow copy of the attribute object so different geometryGroup chunks use different
- // attribute buffers which are correctly indexed in the setMeshBuffers function
- var originalAttribute = material.attributes[ name ];
- var attribute = {};
- for ( var property in originalAttribute ) {
- attribute[ property ] = originalAttribute[ property ];
- }
- if ( ! attribute.__webglInitialized || attribute.createUniqueBuffers ) {
- attribute.__webglInitialized = true;
- var size = 1; // "f" and "i"
- if ( attribute.type === 'v2' ) size = 2;
- else if ( attribute.type === 'v3' ) size = 3;
- else if ( attribute.type === 'v4' ) size = 4;
- else if ( attribute.type === 'c' ) size = 3;
- attribute.size = size;
- attribute.array = new Float32Array( nvertices * size );
- attribute.buffer = gl.createBuffer();
- attribute.buffer.belongsToAttribute = name;
- originalAttribute.needsUpdate = true;
- attribute.__original = originalAttribute;
- }
- geometryGroup.__webglCustomAttributesList.push( attribute );
- }
- }
- geometryGroup.__inittedArrays = true;
- };
- // Buffer setting
- this.setPointCloudBuffers = function ( geometry, hint, object ) {
- var v, c, vertex, offset, color,
- vertices = geometry.vertices,
- vl = vertices.length,
- colors = geometry.colors,
- cl = colors.length,
- vertexArray = geometry.__vertexArray,
- colorArray = geometry.__colorArray,
- dirtyVertices = geometry.verticesNeedUpdate,
- dirtyColors = geometry.colorsNeedUpdate,
- customAttributes = geometry.__webglCustomAttributesList,
- i, il,
- ca, cal, value,
- customAttribute;
- if ( dirtyVertices ) {
- for ( v = 0; v < vl; v ++ ) {
- vertex = vertices[ v ];
- offset = v * 3;
- vertexArray[ offset ] = vertex.x;
- vertexArray[ offset + 1 ] = vertex.y;
- vertexArray[ offset + 2 ] = vertex.z;
- }
- gl.bindBuffer( gl.ARRAY_BUFFER, geometry.__webglVertexBuffer );
- gl.bufferData( gl.ARRAY_BUFFER, vertexArray, hint );
- }
- if ( dirtyColors ) {
- for ( c = 0; c < cl; c ++ ) {
- color = colors[ c ];
- offset = c * 3;
- colorArray[ offset ] = color.r;
- colorArray[ offset + 1 ] = color.g;
- colorArray[ offset + 2 ] = color.b;
- }
- gl.bindBuffer( gl.ARRAY_BUFFER, geometry.__webglColorBuffer );
- gl.bufferData( gl.ARRAY_BUFFER, colorArray, hint );
- }
- if ( customAttributes ) {
- for ( i = 0, il = customAttributes.length; i < il; i ++ ) {
- customAttribute = customAttributes[ i ];
- if ( customAttribute.needsUpdate && ( customAttribute.boundTo === undefined || customAttribute.boundTo === 'vertices' ) ) {
- cal = customAttribute.value.length;
- offset = 0;
- if ( customAttribute.size === 1 ) {
- for ( ca = 0; ca < cal; ca ++ ) {
- customAttribute.array[ ca ] = customAttribute.value[ ca ];
- }
- } else if ( customAttribute.size === 2 ) {
- for ( ca = 0; ca < cal; ca ++ ) {
- value = customAttribute.value[ ca ];
- customAttribute.array[ offset ] = value.x;
- customAttribute.array[ offset + 1 ] = value.y;
- offset += 2;
- }
- } else if ( customAttribute.size === 3 ) {
- if ( customAttribute.type === 'c' ) {
- for ( ca = 0; ca < cal; ca ++ ) {
- value = customAttribute.value[ ca ];
- customAttribute.array[ offset ] = value.r;
- customAttribute.array[ offset + 1 ] = value.g;
- customAttribute.array[ offset + 2 ] = value.b;
- offset += 3;
- }
- } else {
- for ( ca = 0; ca < cal; ca ++ ) {
- value = customAttribute.value[ ca ];
- customAttribute.array[ offset ] = value.x;
- customAttribute.array[ offset + 1 ] = value.y;
- customAttribute.array[ offset + 2 ] = value.z;
- offset += 3;
- }
- }
- } else if ( customAttribute.size === 4 ) {
- for ( ca = 0; ca < cal; ca ++ ) {
- value = customAttribute.value[ ca ];
- customAttribute.array[ offset ] = value.x;
- customAttribute.array[ offset + 1 ] = value.y;
- customAttribute.array[ offset + 2 ] = value.z;
- customAttribute.array[ offset + 3 ] = value.w;
- offset += 4;
- }
- }
- }
- gl.bindBuffer( gl.ARRAY_BUFFER, customAttribute.buffer );
- gl.bufferData( gl.ARRAY_BUFFER, customAttribute.array, hint );
- customAttribute.needsUpdate = false;
- }
- }
- };
- this.setLineBuffers = function ( geometry, hint ) {
- var v, c, d, vertex, offset, color,
- vertices = geometry.vertices,
- colors = geometry.colors,
- lineDistances = geometry.lineDistances,
- vl = vertices.length,
- cl = colors.length,
- dl = lineDistances.length,
- vertexArray = geometry.__vertexArray,
- colorArray = geometry.__colorArray,
- lineDistanceArray = geometry.__lineDistanceArray,
- dirtyVertices = geometry.verticesNeedUpdate,
- dirtyColors = geometry.colorsNeedUpdate,
- dirtyLineDistances = geometry.lineDistancesNeedUpdate,
- customAttributes = geometry.__webglCustomAttributesList,
- i, il,
- ca, cal, value,
- customAttribute;
- if ( dirtyVertices ) {
- for ( v = 0; v < vl; v ++ ) {
- vertex = vertices[ v ];
- offset = v * 3;
- vertexArray[ offset ] = vertex.x;
- vertexArray[ offset + 1 ] = vertex.y;
- vertexArray[ offset + 2 ] = vertex.z;
- }
- gl.bindBuffer( gl.ARRAY_BUFFER, geometry.__webglVertexBuffer );
- gl.bufferData( gl.ARRAY_BUFFER, vertexArray, hint );
- }
- if ( dirtyColors ) {
- for ( c = 0; c < cl; c ++ ) {
- color = colors[ c ];
- offset = c * 3;
- colorArray[ offset ] = color.r;
- colorArray[ offset + 1 ] = color.g;
- colorArray[ offset + 2 ] = color.b;
- }
- gl.bindBuffer( gl.ARRAY_BUFFER, geometry.__webglColorBuffer );
- gl.bufferData( gl.ARRAY_BUFFER, colorArray, hint );
- }
- if ( dirtyLineDistances ) {
- for ( d = 0; d < dl; d ++ ) {
- lineDistanceArray[ d ] = lineDistances[ d ];
- }
- gl.bindBuffer( gl.ARRAY_BUFFER, geometry.__webglLineDistanceBuffer );
- gl.bufferData( gl.ARRAY_BUFFER, lineDistanceArray, hint );
- }
- if ( customAttributes ) {
- for ( i = 0, il = customAttributes.length; i < il; i ++ ) {
- customAttribute = customAttributes[ i ];
- if ( customAttribute.needsUpdate && ( customAttribute.boundTo === undefined || customAttribute.boundTo === 'vertices' ) ) {
- offset = 0;
- cal = customAttribute.value.length;
- if ( customAttribute.size === 1 ) {
- for ( ca = 0; ca < cal; ca ++ ) {
- customAttribute.array[ ca ] = customAttribute.value[ ca ];
- }
- } else if ( customAttribute.size === 2 ) {
- for ( ca = 0; ca < cal; ca ++ ) {
- value = customAttribute.value[ ca ];
- customAttribute.array[ offset ] = value.x;
- customAttribute.array[ offset + 1 ] = value.y;
- offset += 2;
- }
- } else if ( customAttribute.size === 3 ) {
- if ( customAttribute.type === 'c' ) {
- for ( ca = 0; ca < cal; ca ++ ) {
- value = customAttribute.value[ ca ];
- customAttribute.array[ offset ] = value.r;
- customAttribute.array[ offset + 1 ] = value.g;
- customAttribute.array[ offset + 2 ] = value.b;
- offset += 3;
- }
- } else {
- for ( ca = 0; ca < cal; ca ++ ) {
- value = customAttribute.value[ ca ];
- customAttribute.array[ offset ] = value.x;
- customAttribute.array[ offset + 1 ] = value.y;
- customAttribute.array[ offset + 2 ] = value.z;
- offset += 3;
- }
- }
- } else if ( customAttribute.size === 4 ) {
- for ( ca = 0; ca < cal; ca ++ ) {
- value = customAttribute.value[ ca ];
- customAttribute.array[ offset ] = value.x;
- customAttribute.array[ offset + 1 ] = value.y;
- customAttribute.array[ offset + 2 ] = value.z;
- customAttribute.array[ offset + 3 ] = value.w;
- offset += 4;
- }
- }
- gl.bindBuffer( gl.ARRAY_BUFFER, customAttribute.buffer );
- gl.bufferData( gl.ARRAY_BUFFER, customAttribute.array, hint );
- customAttribute.needsUpdate = false;
- }
- }
- }
- };
- function materialNeedsFaceNormals ( material ) {
- return material instanceof THREE.MeshPhongMaterial === false && material.shading === THREE.FlatShading;
- }
- this.setMeshBuffers = function ( geometryGroup, object, hint, dispose, material ) {
- if ( ! geometryGroup.__inittedArrays ) {
- return;
- }
- var needsFaceNormals = materialNeedsFaceNormals( material );
- var f, fl, fi, face,
- vertexNormals, faceNormal,
- vertexColors, faceColor,
- vertexTangents,
- uv, uv2, v1, v2, v3, t1, t2, t3, n1, n2, n3,
- c1, c2, c3,
- sw1, sw2, sw3,
- si1, si2, si3,
- i, il,
- vn, uvi, uv2i,
- vk, vkl, vka,
- nka, chf, faceVertexNormals,
- vertexIndex = 0,
- offset = 0,
- offset_uv = 0,
- offset_uv2 = 0,
- offset_face = 0,
- offset_normal = 0,
- offset_tangent = 0,
- offset_line = 0,
- offset_color = 0,
- offset_skin = 0,
- offset_morphTarget = 0,
- offset_custom = 0,
- value,
- vertexArray = geometryGroup.__vertexArray,
- uvArray = geometryGroup.__uvArray,
- uv2Array = geometryGroup.__uv2Array,
- normalArray = geometryGroup.__normalArray,
- tangentArray = geometryGroup.__tangentArray,
- colorArray = geometryGroup.__colorArray,
- skinIndexArray = geometryGroup.__skinIndexArray,
- skinWeightArray = geometryGroup.__skinWeightArray,
- morphTargetsArrays = geometryGroup.__morphTargetsArrays,
- morphNormalsArrays = geometryGroup.__morphNormalsArrays,
- customAttributes = geometryGroup.__webglCustomAttributesList,
- customAttribute,
- faceArray = geometryGroup.__faceArray,
- lineArray = geometryGroup.__lineArray,
- geometry = object.geometry, // this is shared for all chunks
- dirtyVertices = geometry.verticesNeedUpdate,
- dirtyElements = geometry.elementsNeedUpdate,
- dirtyUvs = geometry.uvsNeedUpdate,
- dirtyNormals = geometry.normalsNeedUpdate,
- dirtyTangents = geometry.tangentsNeedUpdate,
- dirtyColors = geometry.colorsNeedUpdate,
- dirtyMorphTargets = geometry.morphTargetsNeedUpdate,
- vertices = geometry.vertices,
- chunk_faces = geometryGroup.faces,
- obj_faces = geometry.faces,
- obj_uvs = geometry.faceVertexUvs[ 0 ],
- obj_uvs2 = geometry.faceVertexUvs[ 1 ],
- obj_skinIndices = geometry.skinIndices,
- obj_skinWeights = geometry.skinWeights,
- morphTargets = geometry.morphTargets,
- morphNormals = geometry.morphNormals;
- if ( dirtyVertices ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- face = obj_faces[ chunk_faces[ f ] ];
- v1 = vertices[ face.a ];
- v2 = vertices[ face.b ];
- v3 = vertices[ face.c ];
- vertexArray[ offset ] = v1.x;
- vertexArray[ offset + 1 ] = v1.y;
- vertexArray[ offset + 2 ] = v1.z;
- vertexArray[ offset + 3 ] = v2.x;
- vertexArray[ offset + 4 ] = v2.y;
- vertexArray[ offset + 5 ] = v2.z;
- vertexArray[ offset + 6 ] = v3.x;
- vertexArray[ offset + 7 ] = v3.y;
- vertexArray[ offset + 8 ] = v3.z;
- offset += 9;
- }
- gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglVertexBuffer );
- gl.bufferData( gl.ARRAY_BUFFER, vertexArray, hint );
- }
- if ( dirtyMorphTargets ) {
- for ( vk = 0, vkl = morphTargets.length; vk < vkl; vk ++ ) {
- offset_morphTarget = 0;
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- chf = chunk_faces[ f ];
- face = obj_faces[ chf ];
- // morph positions
- v1 = morphTargets[ vk ].vertices[ face.a ];
- v2 = morphTargets[ vk ].vertices[ face.b ];
- v3 = morphTargets[ vk ].vertices[ face.c ];
- vka = morphTargetsArrays[ vk ];
- vka[ offset_morphTarget ] = v1.x;
- vka[ offset_morphTarget + 1 ] = v1.y;
- vka[ offset_morphTarget + 2 ] = v1.z;
- vka[ offset_morphTarget + 3 ] = v2.x;
- vka[ offset_morphTarget + 4 ] = v2.y;
- vka[ offset_morphTarget + 5 ] = v2.z;
- vka[ offset_morphTarget + 6 ] = v3.x;
- vka[ offset_morphTarget + 7 ] = v3.y;
- vka[ offset_morphTarget + 8 ] = v3.z;
- // morph normals
- if ( material.morphNormals ) {
- if ( needsFaceNormals ) {
- n1 = morphNormals[ vk ].faceNormals[ chf ];
- n2 = n1;
- n3 = n1;
- } else {
- faceVertexNormals = morphNormals[ vk ].vertexNormals[ chf ];
- n1 = faceVertexNormals.a;
- n2 = faceVertexNormals.b;
- n3 = faceVertexNormals.c;
- }
- nka = morphNormalsArrays[ vk ];
- nka[ offset_morphTarget ] = n1.x;
- nka[ offset_morphTarget + 1 ] = n1.y;
- nka[ offset_morphTarget + 2 ] = n1.z;
- nka[ offset_morphTarget + 3 ] = n2.x;
- nka[ offset_morphTarget + 4 ] = n2.y;
- nka[ offset_morphTarget + 5 ] = n2.z;
- nka[ offset_morphTarget + 6 ] = n3.x;
- nka[ offset_morphTarget + 7 ] = n3.y;
- nka[ offset_morphTarget + 8 ] = n3.z;
- }
- //
- offset_morphTarget += 9;
- }
- gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ vk ] );
- gl.bufferData( gl.ARRAY_BUFFER, morphTargetsArrays[ vk ], hint );
- if ( material.morphNormals ) {
- gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglMorphNormalsBuffers[ vk ] );
- gl.bufferData( gl.ARRAY_BUFFER, morphNormalsArrays[ vk ], hint );
- }
- }
- }
- if ( obj_skinWeights.length ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- face = obj_faces[ chunk_faces[ f ] ];
- // weights
- sw1 = obj_skinWeights[ face.a ];
- sw2 = obj_skinWeights[ face.b ];
- sw3 = obj_skinWeights[ face.c ];
- skinWeightArray[ offset_skin ] = sw1.x;
- skinWeightArray[ offset_skin + 1 ] = sw1.y;
- skinWeightArray[ offset_skin + 2 ] = sw1.z;
- skinWeightArray[ offset_skin + 3 ] = sw1.w;
- skinWeightArray[ offset_skin + 4 ] = sw2.x;
- skinWeightArray[ offset_skin + 5 ] = sw2.y;
- skinWeightArray[ offset_skin + 6 ] = sw2.z;
- skinWeightArray[ offset_skin + 7 ] = sw2.w;
- skinWeightArray[ offset_skin + 8 ] = sw3.x;
- skinWeightArray[ offset_skin + 9 ] = sw3.y;
- skinWeightArray[ offset_skin + 10 ] = sw3.z;
- skinWeightArray[ offset_skin + 11 ] = sw3.w;
- // indices
- si1 = obj_skinIndices[ face.a ];
- si2 = obj_skinIndices[ face.b ];
- si3 = obj_skinIndices[ face.c ];
- skinIndexArray[ offset_skin ] = si1.x;
- skinIndexArray[ offset_skin + 1 ] = si1.y;
- skinIndexArray[ offset_skin + 2 ] = si1.z;
- skinIndexArray[ offset_skin + 3 ] = si1.w;
- skinIndexArray[ offset_skin + 4 ] = si2.x;
- skinIndexArray[ offset_skin + 5 ] = si2.y;
- skinIndexArray[ offset_skin + 6 ] = si2.z;
- skinIndexArray[ offset_skin + 7 ] = si2.w;
- skinIndexArray[ offset_skin + 8 ] = si3.x;
- skinIndexArray[ offset_skin + 9 ] = si3.y;
- skinIndexArray[ offset_skin + 10 ] = si3.z;
- skinIndexArray[ offset_skin + 11 ] = si3.w;
- offset_skin += 12;
- }
- if ( offset_skin > 0 ) {
- gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglSkinIndicesBuffer );
- gl.bufferData( gl.ARRAY_BUFFER, skinIndexArray, hint );
- gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglSkinWeightsBuffer );
- gl.bufferData( gl.ARRAY_BUFFER, skinWeightArray, hint );
- }
- }
- if ( dirtyColors ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- face = obj_faces[ chunk_faces[ f ] ];
- vertexColors = face.vertexColors;
- faceColor = face.color;
- if ( vertexColors.length === 3 && material.vertexColors === THREE.VertexColors ) {
- c1 = vertexColors[ 0 ];
- c2 = vertexColors[ 1 ];
- c3 = vertexColors[ 2 ];
- } else {
- c1 = faceColor;
- c2 = faceColor;
- c3 = faceColor;
- }
- colorArray[ offset_color ] = c1.r;
- colorArray[ offset_color + 1 ] = c1.g;
- colorArray[ offset_color + 2 ] = c1.b;
- colorArray[ offset_color + 3 ] = c2.r;
- colorArray[ offset_color + 4 ] = c2.g;
- colorArray[ offset_color + 5 ] = c2.b;
- colorArray[ offset_color + 6 ] = c3.r;
- colorArray[ offset_color + 7 ] = c3.g;
- colorArray[ offset_color + 8 ] = c3.b;
- offset_color += 9;
- }
- if ( offset_color > 0 ) {
- gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglColorBuffer );
- gl.bufferData( gl.ARRAY_BUFFER, colorArray, hint );
- }
- }
- if ( dirtyTangents && geometry.hasTangents ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- face = obj_faces[ chunk_faces[ f ] ];
- vertexTangents = face.vertexTangents;
- t1 = vertexTangents[ 0 ];
- t2 = vertexTangents[ 1 ];
- t3 = vertexTangents[ 2 ];
- tangentArray[ offset_tangent ] = t1.x;
- tangentArray[ offset_tangent + 1 ] = t1.y;
- tangentArray[ offset_tangent + 2 ] = t1.z;
- tangentArray[ offset_tangent + 3 ] = t1.w;
- tangentArray[ offset_tangent + 4 ] = t2.x;
- tangentArray[ offset_tangent + 5 ] = t2.y;
- tangentArray[ offset_tangent + 6 ] = t2.z;
- tangentArray[ offset_tangent + 7 ] = t2.w;
- tangentArray[ offset_tangent + 8 ] = t3.x;
- tangentArray[ offset_tangent + 9 ] = t3.y;
- tangentArray[ offset_tangent + 10 ] = t3.z;
- tangentArray[ offset_tangent + 11 ] = t3.w;
- offset_tangent += 12;
- }
- gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglTangentBuffer );
- gl.bufferData( gl.ARRAY_BUFFER, tangentArray, hint );
- }
- if ( dirtyNormals ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- face = obj_faces[ chunk_faces[ f ] ];
- vertexNormals = face.vertexNormals;
- faceNormal = face.normal;
- if ( vertexNormals.length === 3 && needsFaceNormals === false ) {
- for ( i = 0; i < 3; i ++ ) {
- vn = vertexNormals[ i ];
- normalArray[ offset_normal ] = vn.x;
- normalArray[ offset_normal + 1 ] = vn.y;
- normalArray[ offset_normal + 2 ] = vn.z;
- offset_normal += 3;
- }
- } else {
- for ( i = 0; i < 3; i ++ ) {
- normalArray[ offset_normal ] = faceNormal.x;
- normalArray[ offset_normal + 1 ] = faceNormal.y;
- normalArray[ offset_normal + 2 ] = faceNormal.z;
- offset_normal += 3;
- }
- }
- }
- gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglNormalBuffer );
- gl.bufferData( gl.ARRAY_BUFFER, normalArray, hint );
- }
- if ( dirtyUvs && obj_uvs ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- fi = chunk_faces[ f ];
- uv = obj_uvs[ fi ];
- if ( uv === undefined ) continue;
- for ( i = 0; i < 3; i ++ ) {
- uvi = uv[ i ];
- uvArray[ offset_uv ] = uvi.x;
- uvArray[ offset_uv + 1 ] = uvi.y;
- offset_uv += 2;
- }
- }
- if ( offset_uv > 0 ) {
- gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglUVBuffer );
- gl.bufferData( gl.ARRAY_BUFFER, uvArray, hint );
- }
- }
- if ( dirtyUvs && obj_uvs2 ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- fi = chunk_faces[ f ];
- uv2 = obj_uvs2[ fi ];
- if ( uv2 === undefined ) continue;
- for ( i = 0; i < 3; i ++ ) {
- uv2i = uv2[ i ];
- uv2Array[ offset_uv2 ] = uv2i.x;
- uv2Array[ offset_uv2 + 1 ] = uv2i.y;
- offset_uv2 += 2;
- }
- }
- if ( offset_uv2 > 0 ) {
- gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglUV2Buffer );
- gl.bufferData( gl.ARRAY_BUFFER, uv2Array, hint );
- }
- }
- if ( dirtyElements ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- faceArray[ offset_face ] = vertexIndex;
- faceArray[ offset_face + 1 ] = vertexIndex + 1;
- faceArray[ offset_face + 2 ] = vertexIndex + 2;
- offset_face += 3;
- lineArray[ offset_line ] = vertexIndex;
- lineArray[ offset_line + 1 ] = vertexIndex + 1;
- lineArray[ offset_line + 2 ] = vertexIndex;
- lineArray[ offset_line + 3 ] = vertexIndex + 2;
- lineArray[ offset_line + 4 ] = vertexIndex + 1;
- lineArray[ offset_line + 5 ] = vertexIndex + 2;
- offset_line += 6;
- vertexIndex += 3;
- }
- gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglFaceBuffer );
- gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faceArray, hint );
- gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglLineBuffer );
- gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
- }
- if ( customAttributes ) {
- for ( i = 0, il = customAttributes.length; i < il; i ++ ) {
- customAttribute = customAttributes[ i ];
- if ( ! customAttribute.__original.needsUpdate ) continue;
- offset_custom = 0;
- if ( customAttribute.size === 1 ) {
- if ( customAttribute.boundTo === undefined || customAttribute.boundTo === 'vertices' ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- face = obj_faces[ chunk_faces[ f ] ];
- customAttribute.array[ offset_custom ] = customAttribute.value[ face.a ];
- customAttribute.array[ offset_custom + 1 ] = customAttribute.value[ face.b ];
- customAttribute.array[ offset_custom + 2 ] = customAttribute.value[ face.c ];
- offset_custom += 3;
- }
- } else if ( customAttribute.boundTo === 'faces' ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- value = customAttribute.value[ chunk_faces[ f ] ];
- customAttribute.array[ offset_custom ] = value;
- customAttribute.array[ offset_custom + 1 ] = value;
- customAttribute.array[ offset_custom + 2 ] = value;
- offset_custom += 3;
- }
- }
- } else if ( customAttribute.size === 2 ) {
- if ( customAttribute.boundTo === undefined || customAttribute.boundTo === 'vertices' ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- face = obj_faces[ chunk_faces[ f ] ];
- v1 = customAttribute.value[ face.a ];
- v2 = customAttribute.value[ face.b ];
- v3 = customAttribute.value[ face.c ];
- customAttribute.array[ offset_custom ] = v1.x;
- customAttribute.array[ offset_custom + 1 ] = v1.y;
- customAttribute.array[ offset_custom + 2 ] = v2.x;
- customAttribute.array[ offset_custom + 3 ] = v2.y;
- customAttribute.array[ offset_custom + 4 ] = v3.x;
- customAttribute.array[ offset_custom + 5 ] = v3.y;
- offset_custom += 6;
- }
- } else if ( customAttribute.boundTo === 'faces' ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- value = customAttribute.value[ chunk_faces[ f ] ];
- v1 = value;
- v2 = value;
- v3 = value;
- customAttribute.array[ offset_custom ] = v1.x;
- customAttribute.array[ offset_custom + 1 ] = v1.y;
- customAttribute.array[ offset_custom + 2 ] = v2.x;
- customAttribute.array[ offset_custom + 3 ] = v2.y;
- customAttribute.array[ offset_custom + 4 ] = v3.x;
- customAttribute.array[ offset_custom + 5 ] = v3.y;
- offset_custom += 6;
- }
- }
- } else if ( customAttribute.size === 3 ) {
- var pp;
- if ( customAttribute.type === 'c' ) {
- pp = [ 'r', 'g', 'b' ];
- } else {
- pp = [ 'x', 'y', 'z' ];
- }
- if ( customAttribute.boundTo === undefined || customAttribute.boundTo === 'vertices' ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- face = obj_faces[ chunk_faces[ f ] ];
- v1 = customAttribute.value[ face.a ];
- v2 = customAttribute.value[ face.b ];
- v3 = customAttribute.value[ face.c ];
- customAttribute.array[ offset_custom ] = v1[ pp[ 0 ] ];
- customAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ];
- customAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ];
- customAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ];
- customAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ];
- customAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ];
- customAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ];
- customAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ];
- customAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ];
- offset_custom += 9;
- }
- } else if ( customAttribute.boundTo === 'faces' ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- value = customAttribute.value[ chunk_faces[ f ] ];
- v1 = value;
- v2 = value;
- v3 = value;
- customAttribute.array[ offset_custom ] = v1[ pp[ 0 ] ];
- customAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ];
- customAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ];
- customAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ];
- customAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ];
- customAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ];
- customAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ];
- customAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ];
- customAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ];
- offset_custom += 9;
- }
- } else if ( customAttribute.boundTo === 'faceVertices' ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- value = customAttribute.value[ chunk_faces[ f ] ];
- v1 = value[ 0 ];
- v2 = value[ 1 ];
- v3 = value[ 2 ];
- customAttribute.array[ offset_custom ] = v1[ pp[ 0 ] ];
- customAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ];
- customAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ];
- customAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ];
- customAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ];
- customAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ];
- customAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ];
- customAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ];
- customAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ];
- offset_custom += 9;
- }
- }
- } else if ( customAttribute.size === 4 ) {
- if ( customAttribute.boundTo === undefined || customAttribute.boundTo === 'vertices' ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- face = obj_faces[ chunk_faces[ f ] ];
- v1 = customAttribute.value[ face.a ];
- v2 = customAttribute.value[ face.b ];
- v3 = customAttribute.value[ face.c ];
- customAttribute.array[ offset_custom ] = v1.x;
- customAttribute.array[ offset_custom + 1 ] = v1.y;
- customAttribute.array[ offset_custom + 2 ] = v1.z;
- customAttribute.array[ offset_custom + 3 ] = v1.w;
- customAttribute.array[ offset_custom + 4 ] = v2.x;
- customAttribute.array[ offset_custom + 5 ] = v2.y;
- customAttribute.array[ offset_custom + 6 ] = v2.z;
- customAttribute.array[ offset_custom + 7 ] = v2.w;
- customAttribute.array[ offset_custom + 8 ] = v3.x;
- customAttribute.array[ offset_custom + 9 ] = v3.y;
- customAttribute.array[ offset_custom + 10 ] = v3.z;
- customAttribute.array[ offset_custom + 11 ] = v3.w;
- offset_custom += 12;
- }
- } else if ( customAttribute.boundTo === 'faces' ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- value = customAttribute.value[ chunk_faces[ f ] ];
- v1 = value;
- v2 = value;
- v3 = value;
- customAttribute.array[ offset_custom ] = v1.x;
- customAttribute.array[ offset_custom + 1 ] = v1.y;
- customAttribute.array[ offset_custom + 2 ] = v1.z;
- customAttribute.array[ offset_custom + 3 ] = v1.w;
- customAttribute.array[ offset_custom + 4 ] = v2.x;
- customAttribute.array[ offset_custom + 5 ] = v2.y;
- customAttribute.array[ offset_custom + 6 ] = v2.z;
- customAttribute.array[ offset_custom + 7 ] = v2.w;
- customAttribute.array[ offset_custom + 8 ] = v3.x;
- customAttribute.array[ offset_custom + 9 ] = v3.y;
- customAttribute.array[ offset_custom + 10 ] = v3.z;
- customAttribute.array[ offset_custom + 11 ] = v3.w;
- offset_custom += 12;
- }
- } else if ( customAttribute.boundTo === 'faceVertices' ) {
- for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
- value = customAttribute.value[ chunk_faces[ f ] ];
- v1 = value[ 0 ];
- v2 = value[ 1 ];
- v3 = value[ 2 ];
- customAttribute.array[ offset_custom ] = v1.x;
- customAttribute.array[ offset_custom + 1 ] = v1.y;
- customAttribute.array[ offset_custom + 2 ] = v1.z;
- customAttribute.array[ offset_custom + 3 ] = v1.w;
- customAttribute.array[ offset_custom + 4 ] = v2.x;
- customAttribute.array[ offset_custom + 5 ] = v2.y;
- customAttribute.array[ offset_custom + 6 ] = v2.z;
- customAttribute.array[ offset_custom + 7 ] = v2.w;
- customAttribute.array[ offset_custom + 8 ] = v3.x;
- customAttribute.array[ offset_custom + 9 ] = v3.y;
- customAttribute.array[ offset_custom + 10 ] = v3.z;
- customAttribute.array[ offset_custom + 11 ] = v3.w;
- offset_custom += 12;
- }
- }
- }
- gl.bindBuffer( gl.ARRAY_BUFFER, customAttribute.buffer );
- gl.bufferData( gl.ARRAY_BUFFER, customAttribute.array, hint );
- }
- }
- if ( dispose ) {
- delete geometryGroup.__inittedArrays;
- delete geometryGroup.__colorArray;
- delete geometryGroup.__normalArray;
- delete geometryGroup.__tangentArray;
- delete geometryGroup.__uvArray;
- delete geometryGroup.__uv2Array;
- delete geometryGroup.__faceArray;
- delete geometryGroup.__vertexArray;
- delete geometryGroup.__lineArray;
- delete geometryGroup.__skinIndexArray;
- delete geometryGroup.__skinWeightArray;
- }
- };
- this.delete = function ( geometry ) {
- var buffers = [
- '__webglVertexBuffer',
- '__webglNormalBuffer',
- '__webglTangentBuffer',
- '__webglColorBuffer',
- '__webglUVBuffer',
- '__webglUV2Buffer',
- '__webglSkinIndicesBuffer',
- '__webglSkinWeightsBuffer',
- '__webglFaceBuffer',
- '__webglLineBuffer',
- '__webglLineDistanceBuffer'
- ];
- for ( var i = 0, l = buffers.length; i < l; i ++ ) {
- var name = buffers[ i ];
- if ( geometry[ name ] !== undefined ) {
- gl.deleteBuffer( geometry[ name ] );
- delete geometry[ name ];
- }
- }
- // custom attributes
- if ( geometry.__webglCustomAttributesList !== undefined ) {
- for ( var name in geometry.__webglCustomAttributesList ) {
- gl.deleteBuffer( geometry.__webglCustomAttributesList[ name ].buffer );
- }
- delete geometry.__webglCustomAttributesList;
- }
- info.memory.geometries --;
- };
- };
|