Java Code Examples for com.jme3.util.BufferUtils#setInBuffer()
The following examples show how to use
com.jme3.util.BufferUtils#setInBuffer() .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: Pose.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 6 votes |
/** * Applies the offsets of this pose to the vertex buffer given by the blend factor. * * @param blend Blend factor, 0 = no change to vertex buffer, 1 = apply full offsets * @param vertbuf Vertex buffer to apply this pose to */ public void apply(float blend, FloatBuffer vertbuf){ for (int i = 0; i < indices.length; i++){ Vector3f offset = offsets[i]; int vertIndex = indices[i]; tempVec.set(offset).multLocal(blend); // acquire vertex BufferUtils.populateFromBuffer(tempVec2, vertbuf, vertIndex); // add offset multiplied by factor tempVec2.addLocal(tempVec); // write modified vertex BufferUtils.setInBuffer(tempVec2, vertbuf, vertIndex); } }
Example 2
Source File: Pose.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 6 votes |
/** * Applies the offsets of this pose to the vertex buffer given by the blend factor. * * @param blend Blend factor, 0 = no change to vertex buffer, 1 = apply full offsets * @param vertbuf Vertex buffer to apply this pose to */ public void apply(float blend, FloatBuffer vertbuf){ for (int i = 0; i < indices.length; i++){ Vector3f offset = offsets[i]; int vertIndex = indices[i]; tempVec.set(offset).multLocal(blend); // acquire vertex BufferUtils.populateFromBuffer(tempVec2, vertbuf, vertIndex); // add offset multiplied by factor tempVec2.addLocal(tempVec); // write modified vertex BufferUtils.setInBuffer(tempVec2, vertbuf, vertIndex); } }
Example 3
Source File: TerrainPatch.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 5 votes |
private void setInBuffer(Mesh mesh, int index, Vector3f normal, Vector3f tangent, Vector3f binormal) { VertexBuffer NB = mesh.getBuffer(Type.Normal); VertexBuffer TB = mesh.getBuffer(Type.Tangent); VertexBuffer BB = mesh.getBuffer(Type.Binormal); BufferUtils.setInBuffer(normal, (FloatBuffer)NB.getData(), index); BufferUtils.setInBuffer(tangent, (FloatBuffer)TB.getData(), index); BufferUtils.setInBuffer(binormal, (FloatBuffer)BB.getData(), index); NB.setUpdateNeeded(); TB.setUpdateNeeded(); BB.setUpdateNeeded(); }
Example 4
Source File: TerrainPatch.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 5 votes |
private void setInBuffer(Mesh mesh, int index, Vector3f normal, Vector3f tangent, Vector3f binormal) { VertexBuffer NB = mesh.getBuffer(Type.Normal); VertexBuffer TB = mesh.getBuffer(Type.Tangent); VertexBuffer BB = mesh.getBuffer(Type.Binormal); BufferUtils.setInBuffer(normal, (FloatBuffer)NB.getData(), index); BufferUtils.setInBuffer(tangent, (FloatBuffer)TB.getData(), index); BufferUtils.setInBuffer(binormal, (FloatBuffer)BB.getData(), index); NB.setUpdateNeeded(); TB.setUpdateNeeded(); BB.setUpdateNeeded(); }
Example 5
Source File: LODGeomap.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 4 votes |
public FloatBuffer[] writeTangentArray(FloatBuffer normalBuffer, FloatBuffer tangentStore, FloatBuffer binormalStore, FloatBuffer textureBuffer, Vector3f scale) { if (!isLoaded()) { throw new NullPointerException(); } if (tangentStore != null) { if (tangentStore.remaining() < getWidth() * getHeight() * 3) { throw new BufferUnderflowException(); } } else { tangentStore = BufferUtils.createFloatBuffer(getWidth() * getHeight() * 3); } tangentStore.rewind(); if (binormalStore != null) { if (binormalStore.remaining() < getWidth() * getHeight() * 3) { throw new BufferUnderflowException(); } } else { binormalStore = BufferUtils.createFloatBuffer(getWidth() * getHeight() * 3); } binormalStore.rewind(); Vector3f normal = new Vector3f(); Vector3f tangent = new Vector3f(); Vector3f binormal = new Vector3f(); /*Vector3f v1 = new Vector3f(); Vector3f v2 = new Vector3f(); Vector3f v3 = new Vector3f(); Vector2f t1 = new Vector2f(); Vector2f t2 = new Vector2f(); Vector2f t3 = new Vector2f();*/ for (int r = 0; r < getHeight(); r++) { for (int c = 0; c < getWidth(); c++) { int idx = (r * getWidth() + c) * 3; normal.set(normalBuffer.get(idx), normalBuffer.get(idx+1), normalBuffer.get(idx+2)); tangent.set(normal.cross(new Vector3f(0,0,1))); binormal.set(new Vector3f(1,0,0).cross(normal)); BufferUtils.setInBuffer(tangent.normalizeLocal(), tangentStore, (r * getWidth() + c)); // save the tangent BufferUtils.setInBuffer(binormal.normalizeLocal(), binormalStore, (r * getWidth() + c)); // save the binormal } } /* for (int r = 0; r < getHeight(); r++) { for (int c = 0; c < getWidth(); c++) { int texIdx = ((getHeight() - 1 - r) * getWidth() + c) * 2; // pull from the end int texIdxAbove = ((getHeight() - 1 - (r - 1)) * getWidth() + c) * 2; // pull from the end int texIdxNext = ((getHeight() - 1 - (r + 1)) * getWidth() + c) * 2; // pull from the end v1.set(c, getValue(c, r), r); t1.set(textureBuffer.get(texIdx), textureBuffer.get(texIdx + 1)); // below if (r == getHeight()-1) { // last row v3.set(c, getValue(c, r), r + 1); float u = textureBuffer.get(texIdx) - textureBuffer.get(texIdxAbove); u += textureBuffer.get(texIdx); float v = textureBuffer.get(texIdx + 1) - textureBuffer.get(texIdxAbove + 1); v += textureBuffer.get(texIdx + 1); t3.set(u, v); } else { v3.set(c, getValue(c, r + 1), r + 1); t3.set(textureBuffer.get(texIdxNext), textureBuffer.get(texIdxNext + 1)); } //right if (c == getWidth()-1) { // last column v2.set(c + 1, getValue(c, r), r); float u = textureBuffer.get(texIdx) - textureBuffer.get(texIdx - 2); u += textureBuffer.get(texIdx); float v = textureBuffer.get(texIdx + 1) - textureBuffer.get(texIdx - 1); v += textureBuffer.get(texIdx - 1); t2.set(u, v); } else { v2.set(c + 1, getValue(c + 1, r), r); // one to the right t2.set(textureBuffer.get(texIdx + 2), textureBuffer.get(texIdx + 3)); } calculateTangent(new Vector3f[]{v1.mult(scale), v2.mult(scale), v3.mult(scale)}, new Vector2f[]{t1, t2, t3}, tangent, binormal); BufferUtils.setInBuffer(tangent, tangentStore, (r * getWidth() + c)); // save the tangent BufferUtils.setInBuffer(binormal, binormalStore, (r * getWidth() + c)); // save the binormal } } */ return new FloatBuffer[]{tangentStore, binormalStore}; }
Example 6
Source File: LODGeomap.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 4 votes |
@Override public FloatBuffer writeNormalArray(FloatBuffer store, Vector3f scale) { if (!isLoaded()) { throw new NullPointerException(); } if (store != null) { if (store.remaining() < getWidth() * getHeight() * 3) { throw new BufferUnderflowException(); } } else { store = BufferUtils.createFloatBuffer(getWidth() * getHeight() * 3); } store.rewind(); TempVars vars = TempVars.get(); Vector3f rootPoint = vars.vect1; Vector3f rightPoint = vars.vect2; Vector3f leftPoint = vars.vect3; Vector3f topPoint = vars.vect4; Vector3f bottomPoint = vars.vect5; Vector3f tmp1 = vars.vect6; // calculate normals for each polygon for (int r = 0; r < getHeight(); r++) { for (int c = 0; c < getWidth(); c++) { rootPoint.set(0, getValue(c, r), 0); Vector3f normal = vars.vect8; if (r == 0) { // first row if (c == 0) { // first column rightPoint.set(1, getValue(c + 1, r), 0); bottomPoint.set(0, getValue(c, r + 1), 1); getNormal(bottomPoint, rootPoint, rightPoint, scale, normal); } else if (c == getWidth() - 1) { // last column leftPoint.set(-1, getValue(c - 1, r), 0); bottomPoint.set(0, getValue(c, r + 1), 1); getNormal(leftPoint, rootPoint, bottomPoint, scale, normal); } else { // all middle columns leftPoint.set(-1, getValue(c - 1, r), 0); rightPoint.set(1, getValue(c + 1, r), 0); bottomPoint.set(0, getValue(c, r + 1), 1); normal.set( getNormal(leftPoint, rootPoint, bottomPoint, scale, tmp1) ); normal.addLocal( getNormal(bottomPoint, rootPoint, rightPoint, scale, tmp1) ); } } else if (r == getHeight() - 1) { // last row if (c == 0) { // first column topPoint.set(0, getValue(c, r - 1), -1); rightPoint.set(1, getValue(c + 1, r), 0); getNormal(rightPoint, rootPoint, topPoint, scale, normal); } else if (c == getWidth() - 1) { // last column topPoint.set(0, getValue(c, r - 1), -1); leftPoint.set(-1, getValue(c - 1, r), 0); getNormal(topPoint, rootPoint, leftPoint, scale, normal); } else { // all middle columns topPoint.set(0, getValue(c, r - 1), -1); leftPoint.set(-1, getValue(c - 1, r), 0); rightPoint.set(1, getValue(c + 1, r), 0); normal.set( getNormal(topPoint, rootPoint, leftPoint, scale, tmp1) ); normal.addLocal( getNormal(rightPoint, rootPoint, topPoint, scale, tmp1) ); } } else { // all middle rows if (c == 0) { // first column topPoint.set(0, getValue(c, r - 1), -1); rightPoint.set(1, getValue(c + 1, r), 0); bottomPoint.set(0, getValue(c, r + 1), 1); normal.set( getNormal(rightPoint, rootPoint, topPoint, scale, tmp1) ); normal.addLocal( getNormal(bottomPoint, rootPoint, rightPoint, scale, tmp1) ); } else if (c == getWidth() - 1) { // last column topPoint.set(0, getValue(c, r - 1), -1); leftPoint.set(-1, getValue(c - 1, r), 0); bottomPoint.set(0, getValue(c, r + 1), 1); normal.set( getNormal(topPoint, rootPoint, leftPoint, scale, tmp1) ); normal.addLocal( getNormal(leftPoint, rootPoint, bottomPoint, scale, tmp1) ); } else { // all middle columns topPoint.set(0, getValue(c, r - 1), -1); leftPoint.set(-1, getValue(c - 1, r), 0); rightPoint.set(1, getValue(c + 1, r), 0); bottomPoint.set(0, getValue(c, r + 1), 1); normal.set( getNormal(topPoint, rootPoint, leftPoint, scale, tmp1 ) ); normal.addLocal( getNormal(leftPoint, rootPoint, bottomPoint, scale, tmp1) ); normal.addLocal( getNormal(bottomPoint, rootPoint, rightPoint, scale, tmp1) ); normal.addLocal( getNormal(rightPoint, rootPoint, topPoint, scale, tmp1) ); } } normal.normalizeLocal(); BufferUtils.setInBuffer(normal, store, (r * getWidth() + c)); // save the normal } } vars.release(); return store; }
Example 7
Source File: GeoMap.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 4 votes |
/** * Creates a normal array from the normal data in this Geomap * * @param store A preallocated FloatBuffer where to store the data (optional), size must be >= getWidth()*getHeight()*3 * @return store, or a new FloatBuffer if store is null * * @throws NullPointerException If isLoaded() or hasNormalmap() is false */ public FloatBuffer writeNormalArray(FloatBuffer store, Vector3f scale) { if (store!=null){ if (store.remaining() < getWidth()*getHeight()*3) throw new BufferUnderflowException(); }else{ store = BufferUtils.createFloatBuffer(getWidth()*getHeight()*3); } store.rewind(); Vector3f oppositePoint = new Vector3f(); Vector3f adjacentPoint = new Vector3f(); Vector3f rootPoint = new Vector3f(); Vector3f tempNorm = new Vector3f(); int normalIndex = 0; for (int y = 0; y < getHeight(); y++) { for (int x = 0; x < getWidth(); x++) { rootPoint.set(x, getValue(x,y), y); if (y == getHeight() - 1) { if (x == getWidth() - 1) { // case #4 : last row, last col // left cross up // adj = normalIndex - getWidth(); // opp = normalIndex - 1; adjacentPoint.set(x, getValue(x,y-1), y-1); oppositePoint.set(x-1, getValue(x-1, y), y); } else { // case #3 : last row, except for last col // right cross up // adj = normalIndex + 1; // opp = normalIndex - getWidth(); adjacentPoint.set(x+1, getValue(x+1,y), y); oppositePoint.set(x, getValue(x,y-1), y-1); } } else { if (x == getWidth() - 1) { // case #2 : last column except for last row // left cross down adjacentPoint.set(x-1, getValue(x-1,y), y); oppositePoint.set(x, getValue(x,y+1), y+1); // adj = normalIndex - 1; // opp = normalIndex + getWidth(); } else { // case #1 : most cases // right cross down adjacentPoint.set(x, getValue(x,y+1), y+1); oppositePoint.set(x+1, getValue(x+1,y), y); // adj = normalIndex + getWidth(); // opp = normalIndex + 1; } } tempNorm.set(adjacentPoint).subtractLocal(rootPoint) .crossLocal(oppositePoint.subtractLocal(rootPoint)); tempNorm.multLocal(scale).normalizeLocal(); // store.put(tempNorm.x).put(tempNorm.y).put(tempNorm.z); BufferUtils.setInBuffer(tempNorm, store, normalIndex); normalIndex++; } } return store; }
Example 8
Source File: BoundingSphere.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 4 votes |
/** * Used from calcWelzl. This function recurses to calculate a minimum * bounding sphere a few points at a time. * * @param points * The array of points to look through. * @param p * The size of the list to be used. * @param b * The number of points currently considering to include with the * sphere. * @param ap * A variable simulating pointer arithmatic from C++, and offset * in <code>points</code>. */ private void recurseMini(FloatBuffer points, int p, int b, int ap) { //TempVars vars = TempVars.get(); Vector3f tempA = new Vector3f(); //vars.vect1; Vector3f tempB = new Vector3f(); //vars.vect2; Vector3f tempC = new Vector3f(); //vars.vect3; Vector3f tempD = new Vector3f(); //vars.vect4; switch (b) { case 0: this.radius = 0; this.center.set(0, 0, 0); break; case 1: this.radius = 1f - RADIUS_EPSILON; BufferUtils.populateFromBuffer(center, points, ap - 1); break; case 2: BufferUtils.populateFromBuffer(tempA, points, ap - 1); BufferUtils.populateFromBuffer(tempB, points, ap - 2); setSphere(tempA, tempB); break; case 3: BufferUtils.populateFromBuffer(tempA, points, ap - 1); BufferUtils.populateFromBuffer(tempB, points, ap - 2); BufferUtils.populateFromBuffer(tempC, points, ap - 3); setSphere(tempA, tempB, tempC); break; case 4: BufferUtils.populateFromBuffer(tempA, points, ap - 1); BufferUtils.populateFromBuffer(tempB, points, ap - 2); BufferUtils.populateFromBuffer(tempC, points, ap - 3); BufferUtils.populateFromBuffer(tempD, points, ap - 4); setSphere(tempA, tempB, tempC, tempD); //vars.release(); return; } for (int i = 0; i < p; i++) { BufferUtils.populateFromBuffer(tempA, points, i + ap); if (tempA.distanceSquared(center) - (radius * radius) > RADIUS_EPSILON - 1f) { for (int j = i; j > 0; j--) { BufferUtils.populateFromBuffer(tempB, points, j + ap); BufferUtils.populateFromBuffer(tempC, points, j - 1 + ap); BufferUtils.setInBuffer(tempC, points, j + ap); BufferUtils.setInBuffer(tempB, points, j - 1 + ap); } recurseMini(points, i, b + 1, ap + 1); } } //vars.release(); }
Example 9
Source File: LODGeomap.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 4 votes |
public FloatBuffer[] writeTangentArray(FloatBuffer normalBuffer, FloatBuffer tangentStore, FloatBuffer binormalStore, FloatBuffer textureBuffer, Vector3f scale) { if (!isLoaded()) { throw new NullPointerException(); } if (tangentStore != null) { if (tangentStore.remaining() < getWidth() * getHeight() * 3) { throw new BufferUnderflowException(); } } else { tangentStore = BufferUtils.createFloatBuffer(getWidth() * getHeight() * 3); } tangentStore.rewind(); if (binormalStore != null) { if (binormalStore.remaining() < getWidth() * getHeight() * 3) { throw new BufferUnderflowException(); } } else { binormalStore = BufferUtils.createFloatBuffer(getWidth() * getHeight() * 3); } binormalStore.rewind(); Vector3f normal = new Vector3f(); Vector3f tangent = new Vector3f(); Vector3f binormal = new Vector3f(); /*Vector3f v1 = new Vector3f(); Vector3f v2 = new Vector3f(); Vector3f v3 = new Vector3f(); Vector2f t1 = new Vector2f(); Vector2f t2 = new Vector2f(); Vector2f t3 = new Vector2f();*/ for (int r = 0; r < getHeight(); r++) { for (int c = 0; c < getWidth(); c++) { int idx = (r * getWidth() + c) * 3; normal.set(normalBuffer.get(idx), normalBuffer.get(idx+1), normalBuffer.get(idx+2)); tangent.set(normal.cross(new Vector3f(0,0,1))); binormal.set(new Vector3f(1,0,0).cross(normal)); BufferUtils.setInBuffer(tangent.normalizeLocal(), tangentStore, (r * getWidth() + c)); // save the tangent BufferUtils.setInBuffer(binormal.normalizeLocal(), binormalStore, (r * getWidth() + c)); // save the binormal } } /* for (int r = 0; r < getHeight(); r++) { for (int c = 0; c < getWidth(); c++) { int texIdx = ((getHeight() - 1 - r) * getWidth() + c) * 2; // pull from the end int texIdxAbove = ((getHeight() - 1 - (r - 1)) * getWidth() + c) * 2; // pull from the end int texIdxNext = ((getHeight() - 1 - (r + 1)) * getWidth() + c) * 2; // pull from the end v1.set(c, getValue(c, r), r); t1.set(textureBuffer.get(texIdx), textureBuffer.get(texIdx + 1)); // below if (r == getHeight()-1) { // last row v3.set(c, getValue(c, r), r + 1); float u = textureBuffer.get(texIdx) - textureBuffer.get(texIdxAbove); u += textureBuffer.get(texIdx); float v = textureBuffer.get(texIdx + 1) - textureBuffer.get(texIdxAbove + 1); v += textureBuffer.get(texIdx + 1); t3.set(u, v); } else { v3.set(c, getValue(c, r + 1), r + 1); t3.set(textureBuffer.get(texIdxNext), textureBuffer.get(texIdxNext + 1)); } //right if (c == getWidth()-1) { // last column v2.set(c + 1, getValue(c, r), r); float u = textureBuffer.get(texIdx) - textureBuffer.get(texIdx - 2); u += textureBuffer.get(texIdx); float v = textureBuffer.get(texIdx + 1) - textureBuffer.get(texIdx - 1); v += textureBuffer.get(texIdx - 1); t2.set(u, v); } else { v2.set(c + 1, getValue(c + 1, r), r); // one to the right t2.set(textureBuffer.get(texIdx + 2), textureBuffer.get(texIdx + 3)); } calculateTangent(new Vector3f[]{v1.mult(scale), v2.mult(scale), v3.mult(scale)}, new Vector2f[]{t1, t2, t3}, tangent, binormal); BufferUtils.setInBuffer(tangent, tangentStore, (r * getWidth() + c)); // save the tangent BufferUtils.setInBuffer(binormal, binormalStore, (r * getWidth() + c)); // save the binormal } } */ return new FloatBuffer[]{tangentStore, binormalStore}; }
Example 10
Source File: LODGeomap.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 4 votes |
@Override public FloatBuffer writeNormalArray(FloatBuffer store, Vector3f scale) { if (!isLoaded()) { throw new NullPointerException(); } if (store != null) { if (store.remaining() < getWidth() * getHeight() * 3) { throw new BufferUnderflowException(); } } else { store = BufferUtils.createFloatBuffer(getWidth() * getHeight() * 3); } store.rewind(); TempVars vars = TempVars.get(); Vector3f rootPoint = vars.vect1; Vector3f rightPoint = vars.vect2; Vector3f leftPoint = vars.vect3; Vector3f topPoint = vars.vect4; Vector3f bottomPoint = vars.vect5; Vector3f tmp1 = vars.vect6; // calculate normals for each polygon for (int r = 0; r < getHeight(); r++) { for (int c = 0; c < getWidth(); c++) { rootPoint.set(0, getValue(c, r), 0); Vector3f normal = vars.vect8; if (r == 0) { // first row if (c == 0) { // first column rightPoint.set(1, getValue(c + 1, r), 0); bottomPoint.set(0, getValue(c, r + 1), 1); getNormal(bottomPoint, rootPoint, rightPoint, scale, normal); } else if (c == getWidth() - 1) { // last column leftPoint.set(-1, getValue(c - 1, r), 0); bottomPoint.set(0, getValue(c, r + 1), 1); getNormal(leftPoint, rootPoint, bottomPoint, scale, normal); } else { // all middle columns leftPoint.set(-1, getValue(c - 1, r), 0); rightPoint.set(1, getValue(c + 1, r), 0); bottomPoint.set(0, getValue(c, r + 1), 1); normal.set( getNormal(leftPoint, rootPoint, bottomPoint, scale, tmp1) ); normal.addLocal( getNormal(bottomPoint, rootPoint, rightPoint, scale, tmp1) ); } } else if (r == getHeight() - 1) { // last row if (c == 0) { // first column topPoint.set(0, getValue(c, r - 1), -1); rightPoint.set(1, getValue(c + 1, r), 0); getNormal(rightPoint, rootPoint, topPoint, scale, normal); } else if (c == getWidth() - 1) { // last column topPoint.set(0, getValue(c, r - 1), -1); leftPoint.set(-1, getValue(c - 1, r), 0); getNormal(topPoint, rootPoint, leftPoint, scale, normal); } else { // all middle columns topPoint.set(0, getValue(c, r - 1), -1); leftPoint.set(-1, getValue(c - 1, r), 0); rightPoint.set(1, getValue(c + 1, r), 0); normal.set( getNormal(topPoint, rootPoint, leftPoint, scale, tmp1) ); normal.addLocal( getNormal(rightPoint, rootPoint, topPoint, scale, tmp1) ); } } else { // all middle rows if (c == 0) { // first column topPoint.set(0, getValue(c, r - 1), -1); rightPoint.set(1, getValue(c + 1, r), 0); bottomPoint.set(0, getValue(c, r + 1), 1); normal.set( getNormal(rightPoint, rootPoint, topPoint, scale, tmp1) ); normal.addLocal( getNormal(bottomPoint, rootPoint, rightPoint, scale, tmp1) ); } else if (c == getWidth() - 1) { // last column topPoint.set(0, getValue(c, r - 1), -1); leftPoint.set(-1, getValue(c - 1, r), 0); bottomPoint.set(0, getValue(c, r + 1), 1); normal.set( getNormal(topPoint, rootPoint, leftPoint, scale, tmp1) ); normal.addLocal( getNormal(leftPoint, rootPoint, bottomPoint, scale, tmp1) ); } else { // all middle columns topPoint.set(0, getValue(c, r - 1), -1); leftPoint.set(-1, getValue(c - 1, r), 0); rightPoint.set(1, getValue(c + 1, r), 0); bottomPoint.set(0, getValue(c, r + 1), 1); normal.set( getNormal(topPoint, rootPoint, leftPoint, scale, tmp1 ) ); normal.addLocal( getNormal(leftPoint, rootPoint, bottomPoint, scale, tmp1) ); normal.addLocal( getNormal(bottomPoint, rootPoint, rightPoint, scale, tmp1) ); normal.addLocal( getNormal(rightPoint, rootPoint, topPoint, scale, tmp1) ); } } normal.normalizeLocal(); BufferUtils.setInBuffer(normal, store, (r * getWidth() + c)); // save the normal } } vars.release(); return store; }
Example 11
Source File: GeoMap.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 4 votes |
/** * Creates a normal array from the normal data in this Geomap * * @param store A preallocated FloatBuffer where to store the data (optional), size must be >= getWidth()*getHeight()*3 * @returns store, or a new FloatBuffer if store is null * * @throws NullPointerException If isLoaded() or hasNormalmap() is false */ public FloatBuffer writeNormalArray(FloatBuffer store, Vector3f scale) { if (store!=null){ if (store.remaining() < getWidth()*getHeight()*3) throw new BufferUnderflowException(); }else{ store = BufferUtils.createFloatBuffer(getWidth()*getHeight()*3); } store.rewind(); Vector3f oppositePoint = new Vector3f(); Vector3f adjacentPoint = new Vector3f(); Vector3f rootPoint = new Vector3f(); Vector3f tempNorm = new Vector3f(); int normalIndex = 0; for (int y = 0; y < getHeight(); y++) { for (int x = 0; x < getWidth(); x++) { rootPoint.set(x, getValue(x,y), y); if (y == getHeight() - 1) { if (x == getWidth() - 1) { // case #4 : last row, last col // left cross up // adj = normalIndex - getWidth(); // opp = normalIndex - 1; adjacentPoint.set(x, getValue(x,y-1), y-1); oppositePoint.set(x-1, getValue(x-1, y), y); } else { // case #3 : last row, except for last col // right cross up // adj = normalIndex + 1; // opp = normalIndex - getWidth(); adjacentPoint.set(x+1, getValue(x+1,y), y); oppositePoint.set(x, getValue(x,y-1), y-1); } } else { if (x == getWidth() - 1) { // case #2 : last column except for last row // left cross down adjacentPoint.set(x-1, getValue(x-1,y), y); oppositePoint.set(x, getValue(x,y+1), y+1); // adj = normalIndex - 1; // opp = normalIndex + getWidth(); } else { // case #1 : most cases // right cross down adjacentPoint.set(x, getValue(x,y+1), y+1); oppositePoint.set(x+1, getValue(x+1,y), y); // adj = normalIndex + getWidth(); // opp = normalIndex + 1; } } tempNorm.set(adjacentPoint).subtractLocal(rootPoint) .crossLocal(oppositePoint.subtractLocal(rootPoint)); tempNorm.multLocal(scale).normalizeLocal(); // store.put(tempNorm.x).put(tempNorm.y).put(tempNorm.z); BufferUtils.setInBuffer(tempNorm, store, normalIndex); normalIndex++; } } return store; }
Example 12
Source File: BoundingSphere.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 4 votes |
/** * Used from calcWelzl. This function recurses to calculate a minimum * bounding sphere a few points at a time. * * @param points * The array of points to look through. * @param p * The size of the list to be used. * @param b * The number of points currently considering to include with the * sphere. * @param ap * A variable simulating pointer arithmatic from C++, and offset * in <code>points</code>. */ private void recurseMini(FloatBuffer points, int p, int b, int ap) { //TempVars vars = TempVars.get(); Vector3f tempA = new Vector3f(); //vars.vect1; Vector3f tempB = new Vector3f(); //vars.vect2; Vector3f tempC = new Vector3f(); //vars.vect3; Vector3f tempD = new Vector3f(); //vars.vect4; switch (b) { case 0: this.radius = 0; this.center.set(0, 0, 0); break; case 1: this.radius = 1f - RADIUS_EPSILON; BufferUtils.populateFromBuffer(center, points, ap - 1); break; case 2: BufferUtils.populateFromBuffer(tempA, points, ap - 1); BufferUtils.populateFromBuffer(tempB, points, ap - 2); setSphere(tempA, tempB); break; case 3: BufferUtils.populateFromBuffer(tempA, points, ap - 1); BufferUtils.populateFromBuffer(tempB, points, ap - 2); BufferUtils.populateFromBuffer(tempC, points, ap - 3); setSphere(tempA, tempB, tempC); break; case 4: BufferUtils.populateFromBuffer(tempA, points, ap - 1); BufferUtils.populateFromBuffer(tempB, points, ap - 2); BufferUtils.populateFromBuffer(tempC, points, ap - 3); BufferUtils.populateFromBuffer(tempD, points, ap - 4); setSphere(tempA, tempB, tempC, tempD); //vars.release(); return; } for (int i = 0; i < p; i++) { BufferUtils.populateFromBuffer(tempA, points, i + ap); if (tempA.distanceSquared(center) - (radius * radius) > RADIUS_EPSILON - 1f) { for (int j = i; j > 0; j--) { BufferUtils.populateFromBuffer(tempB, points, j + ap); BufferUtils.populateFromBuffer(tempC, points, j - 1 + ap); BufferUtils.setInBuffer(tempC, points, j + ap); BufferUtils.setInBuffer(tempB, points, j - 1 + ap); } recurseMini(points, i, b + 1, ap + 1); } } //vars.release(); }