|
@@ -764,6 +764,22 @@ public class VertexBuffer extends NativeObject implements Savable, Cloneable {
|
|
|
* match.
|
|
|
*/
|
|
|
public void copyElement(int inIndex, VertexBuffer outVb, int outIndex){
|
|
|
+ copyElements(inIndex, outVb, outIndex, 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Copies a sequence of elements of data from this <code>VertexBuffer</code>
|
|
|
+ * to the given output VertexBuffer.
|
|
|
+ *
|
|
|
+ * @param inIndex The input element index
|
|
|
+ * @param outVb The buffer to copy to
|
|
|
+ * @param outIndex The output element index
|
|
|
+ * @param len The number of elements to copy
|
|
|
+ *
|
|
|
+ * @throws IllegalArgumentException If the formats of the buffers do not
|
|
|
+ * match.
|
|
|
+ */
|
|
|
+ public void copyElements(int inIndex, VertexBuffer outVb, int outIndex, int len){
|
|
|
if (outVb.format != format || outVb.components != components)
|
|
|
throw new IllegalArgumentException("Buffer format mismatch. Cannot copy");
|
|
|
|
|
@@ -789,37 +805,39 @@ public class VertexBuffer extends NativeObject implements Savable, Cloneable {
|
|
|
case Half:
|
|
|
ByteBuffer bin = (ByteBuffer) srcData;
|
|
|
ByteBuffer bout = (ByteBuffer) outVb.data;
|
|
|
- bin.position(inPos).limit(inPos + elementSz);
|
|
|
- bout.position(outPos).limit(outPos + elementSz);
|
|
|
- bout.put(bin);
|
|
|
+ bin.position(inPos).limit(inPos + elementSz * len);
|
|
|
+ bout.position(outPos).limit(outPos + elementSz * len);
|
|
|
+ bout.put(bin);
|
|
|
break;
|
|
|
case Short:
|
|
|
case UnsignedShort:
|
|
|
ShortBuffer sin = (ShortBuffer) srcData;
|
|
|
ShortBuffer sout = (ShortBuffer) outVb.data;
|
|
|
- sin.position(inPos).limit(inPos + elementSz);
|
|
|
- sout.position(outPos).limit(outPos + elementSz);
|
|
|
+ sin.position(inPos).limit(inPos + elementSz * len);
|
|
|
+ sout.position(outPos).limit(outPos + elementSz * len);
|
|
|
sout.put(sin);
|
|
|
break;
|
|
|
case Int:
|
|
|
case UnsignedInt:
|
|
|
IntBuffer iin = (IntBuffer) srcData;
|
|
|
IntBuffer iout = (IntBuffer) outVb.data;
|
|
|
- iin.position(inPos).limit(inPos + elementSz);
|
|
|
- iout.position(outPos).limit(outPos + elementSz);
|
|
|
+ iin.position(inPos).limit(inPos + elementSz * len);
|
|
|
+ iout.position(outPos).limit(outPos + elementSz * len);
|
|
|
iout.put(iin);
|
|
|
break;
|
|
|
case Float:
|
|
|
FloatBuffer fin = (FloatBuffer) srcData;
|
|
|
FloatBuffer fout = (FloatBuffer) outVb.data;
|
|
|
- fin.position(inPos).limit(inPos + elementSz);
|
|
|
- fout.position(outPos).limit(outPos + elementSz);
|
|
|
+ fin.position(inPos).limit(inPos + elementSz * len);
|
|
|
+ fout.position(outPos).limit(outPos + elementSz * len);
|
|
|
fout.put(fin);
|
|
|
break;
|
|
|
default:
|
|
|
throw new UnsupportedOperationException("Unrecognized buffer format: "+format);
|
|
|
}
|
|
|
|
|
|
+ // Clear the output buffer to rewind it and reset its
|
|
|
+ // limit from where we shortened it above.
|
|
|
outVb.data.clear();
|
|
|
}
|
|
|
|