/** @see org.web3d.x3d.sai.MFVec3f#insertValue(int, float[]) */ public void insertValue(int index, float[] value) throws ArrayIndexOutOfBoundsException { checkReadAccess(); checkWriteAccess(); synchronized (theEventQueue.eventLock) { MFVec3fWrapper queuedElement = (MFVec3fWrapper) theEventQueue.getLast(this); boolean newEvent = false; if (queuedElement == null || !queuedElement.isSetOneValue) { // Input and output buffers do not mix if (!storedInput && !storedOutput) { queuedElement = this; loadInputValue(); isSetOneValue = true; } else { queuedElement = new MFVec3fWrapper(theNode, fieldIndex, theEventQueue, theEventAdapterFactory, true); queuedElement.isSetOneValue = true; } newEvent = true; } queuedElement.ensureArraySize(queuedElement.storedInputLength + 3); System.arraycopy( queuedElement.storedInputValue, index * 3, queuedElement.storedInputValue, index * 3 + 3, queuedElement.storedInputLength - index * 3); queuedElement.storedInputValue[index * 3] = value[0]; queuedElement.storedInputValue[index * 3 + 1] = value[1]; queuedElement.storedInputValue[index * 3 + 2] = value[2]; queuedElement.storedInputLength += 3; if (newEvent) theEventQueue.processEvent(queuedElement); } }
/** * Set the value of the array of 3D vectors. Input is an array of doubles If value[i] does not * contain at least three values it will generate an ArrayIndexOutOfBoundsException. If value[i] * contains more than three items only the first three values will be used and the rest ignored. * * <p>If one or more of the values for value[i] are null then the resulting event that is sent to * the VRML scenegraph is implementation dependent but no error indicator will be set here. * * @param numVec The number of items to copy from the array * @param value The array of vec2f values where<br> * value[i][0] = X<br> * value[i][1] = Y<br> * value[i][2] = Z * @exception ArrayIndexOutOfBoundsException A value did not contain at least three values for the * vector definition. */ public void setValue(int numVec, float[][] value) { checkWriteAccess(); MFVec3fWrapper queuedElement = this; // Input and output buffers do not mix and further don't overwrite // set1Value calls if (isSetOneValue || storedInput || storedOutput) { queuedElement = new MFVec3fWrapper(theNode, fieldIndex, theEventQueue, theEventAdapterFactory); } queuedElement.storedInput = true; if (queuedElement.storedInputValue == null || queuedElement.storedInputValue.length != numVec * 3) queuedElement.storedInputValue = new float[numVec * 3]; ArrayUtils.flatten3(value, numVec, queuedElement.storedInputValue); queuedElement.storedInputLength = numVec * 3; theEventQueue.processEvent(queuedElement); }
/** @see org.web3d.x3d.sai.MFBool#removeValue(int) */ public void removeValue(int index) throws ArrayIndexOutOfBoundsException { checkReadAccess(); checkWriteAccess(); synchronized (theEventQueue.eventLock) { MFVec3fWrapper queuedElement = (MFVec3fWrapper) theEventQueue.getLast(this); boolean newEvent = false; if (queuedElement == null || !queuedElement.isSetOneValue) { // Input and output buffers do not mix if (!storedInput && !storedOutput) { queuedElement = this; loadInputValue(); isSetOneValue = true; } else { queuedElement = new MFVec3fWrapper(theNode, fieldIndex, theEventQueue, theEventAdapterFactory, true); queuedElement.isSetOneValue = true; } newEvent = true; } if (queuedElement.storedInputLength > 0) { if (index * 3 + 3 < queuedElement.storedInputLength) System.arraycopy( queuedElement.storedInputValue, index * 3 + 3, queuedElement.storedInputValue, index * 3, queuedElement.storedInputLength - index * 3 - 3); queuedElement.storedInputLength -= 3; if (newEvent) theEventQueue.processEvent(queuedElement); } else { // Free up the buffer before throwing the exception if (newEvent) queuedElement.isSetOneValue = false; throw new ArrayIndexOutOfBoundsException(); } } }