@Override
  void updateFromNative() {
    super.updateFromNative();

    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
    int[] dataBuffer = new int[5];
    mRS.nElementGetNativeData(getID(mRS), dataBuffer);

    mNormalized = dataBuffer[2] == 1 ? true : false;
    mVectorSize = dataBuffer[3];
    mSize = 0;
    for (DataType dt : DataType.values()) {
      if (dt.mID == dataBuffer[0]) {
        mType = dt;
        mSize = mType.mSize * mVectorSize;
      }
    }
    for (DataKind dk : DataKind.values()) {
      if (dk.mID == dataBuffer[1]) {
        mKind = dk;
      }
    }

    int numSubElements = dataBuffer[4];
    if (numSubElements > 0) {
      mElements = new Element[numSubElements];
      mElementNames = new String[numSubElements];
      mArraySizes = new int[numSubElements];
      mOffsetInBytes = new int[numSubElements];

      long[] subElementIds = new long[numSubElements];
      mRS.nElementGetSubElements(getID(mRS), subElementIds, mElementNames, mArraySizes);
      for (int i = 0; i < numSubElements; i++) {
        mElements[i] = new Element(subElementIds[i], mRS);
        mElements[i].updateFromNative();
        mOffsetInBytes[i] = mSize;
        mSize += mElements[i].mSize * mArraySizes[i];
      }
    }
    updateVisibleSubElements();
  }