125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams/*
225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * Copyright (C) 2008 The Android Open Source Project
325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams *
425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * you may not use this file except in compliance with the License.
625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * You may obtain a copy of the License at
725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams *
825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams *
1025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * Unless required by applicable law or agreed to in writing, software
1125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * See the License for the specific language governing permissions and
1425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * limitations under the License.
1525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams */
1625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
1725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Samspackage android.renderscript;
1825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
1925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
209c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/**
2111518acc8c416023d8c2192b441a1767205676d9Robert Ly * Utility class for packing arguments and structures from Android system objects to
2211518acc8c416023d8c2192b441a1767205676d9Robert Ly * Renderscript objects.
2342d6c9e1e794713022d1370ba844ce05c7b2793fJason Sams *
2442d6c9e1e794713022d1370ba844ce05c7b2793fJason Sams **/
2525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Samspublic class FieldPacker {
2625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    public FieldPacker(int len) {
2725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mPos = 0;
28e27832acc083fa889e86b4c629b6aedd8855cecaStephen Hines        mLen = len;
2925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData = new byte[len];
3025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
3125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
3225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    public void align(int v) {
33e27832acc083fa889e86b4c629b6aedd8855cecaStephen Hines        if ((v <= 0) || ((v & (v - 1)) != 0)) {
34e27832acc083fa889e86b4c629b6aedd8855cecaStephen Hines            throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v);
35e27832acc083fa889e86b4c629b6aedd8855cecaStephen Hines        }
36e27832acc083fa889e86b4c629b6aedd8855cecaStephen Hines
3725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        while ((mPos & (v - 1)) != 0) {
3825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams            mData[mPos++] = 0;
3925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        }
4025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
4125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
42a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void reset() {
4325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mPos = 0;
4425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
45a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void reset(int i) {
46e27832acc083fa889e86b4c629b6aedd8855cecaStephen Hines        if ((i < 0) || (i >= mLen)) {
47e27832acc083fa889e86b4c629b6aedd8855cecaStephen Hines            throw new RSIllegalArgumentException("out of range argument: " + i);
48e27832acc083fa889e86b4c629b6aedd8855cecaStephen Hines        }
49a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        mPos = i;
50a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
5125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
52020bb7b5ac26a6e2d2f6852952a84bb246445fcfJason Sams    public void skip(int i) {
53e27832acc083fa889e86b4c629b6aedd8855cecaStephen Hines        int res = mPos + i;
546e66725e1cd631007c226e9ea7b99211bd1276e5Shih-wei Liao        if ((res < 0) || (res > mLen)) {
55e27832acc083fa889e86b4c629b6aedd8855cecaStephen Hines            throw new RSIllegalArgumentException("out of range argument: " + i);
56e27832acc083fa889e86b4c629b6aedd8855cecaStephen Hines        }
57e27832acc083fa889e86b4c629b6aedd8855cecaStephen Hines        mPos = res;
58020bb7b5ac26a6e2d2f6852952a84bb246445fcfJason Sams    }
59020bb7b5ac26a6e2d2f6852952a84bb246445fcfJason Sams
60a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addI8(byte v) {
6125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = v;
6225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
6325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
64a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addI16(short v) {
6525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        align(2);
6625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)(v & 0xff);
6725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)(v >> 8);
6825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
6925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
70a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addI32(int v) {
7125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        align(4);
7225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)(v & 0xff);
7325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 8) & 0xff);
7425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 16) & 0xff);
7525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 24) & 0xff);
7625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
7725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
78a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addI64(long v) {
7925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        align(8);
8025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)(v & 0xff);
8125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 8) & 0xff);
8225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 16) & 0xff);
8325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 24) & 0xff);
8425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 32) & 0xff);
8525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 40) & 0xff);
8625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 48) & 0xff);
8725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 56) & 0xff);
8825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
8925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
90a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addU8(short v) {
9125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        if ((v < 0) || (v > 0xff)) {
92ee73498ddf896f6ed003e9ce1fab87aefda90173Jason Sams            android.util.Log.e("rs", "FieldPacker.addU8( " + v + " )");
9325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams            throw new IllegalArgumentException("Saving value out of range for type");
9425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        }
9525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)v;
9625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
9725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
98a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addU16(int v) {
9925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        if ((v < 0) || (v > 0xffff)) {
100ee73498ddf896f6ed003e9ce1fab87aefda90173Jason Sams            android.util.Log.e("rs", "FieldPacker.addU16( " + v + " )");
10125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams            throw new IllegalArgumentException("Saving value out of range for type");
10225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        }
10325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        align(2);
10425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)(v & 0xff);
10525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)(v >> 8);
10625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
10725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
108a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addU32(long v) {
109ee73498ddf896f6ed003e9ce1fab87aefda90173Jason Sams        if ((v < 0) || (v > 0xffffffffL)) {
110ee73498ddf896f6ed003e9ce1fab87aefda90173Jason Sams            android.util.Log.e("rs", "FieldPacker.addU32( " + v + " )");
11125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams            throw new IllegalArgumentException("Saving value out of range for type");
11225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        }
11325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        align(4);
11425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)(v & 0xff);
11525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 8) & 0xff);
11625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 16) & 0xff);
11725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 24) & 0xff);
11825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
11925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
120a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addU64(long v) {
12125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        if (v < 0) {
122ee73498ddf896f6ed003e9ce1fab87aefda90173Jason Sams            android.util.Log.e("rs", "FieldPacker.addU64( " + v + " )");
12325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams            throw new IllegalArgumentException("Saving value out of range for type");
12425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        }
12525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        align(8);
12625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)(v & 0xff);
12725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 8) & 0xff);
12825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 16) & 0xff);
12925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 24) & 0xff);
13025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 32) & 0xff);
13125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 40) & 0xff);
13225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 48) & 0xff);
13325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mData[mPos++] = (byte)((v >> 56) & 0xff);
13425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
13525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
136a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addF32(float v) {
13725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        addI32(Float.floatToRawIntBits(v));
13825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
13925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
14002f41705199336f808ece50d81585450e7f8f61fStephen Hines    public void addF64(double v) {
14125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        addI64(Double.doubleToRawLongBits(v));
14225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
14325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
144a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addObj(BaseObj obj) {
145a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        if (obj != null) {
146e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            addI32(obj.getID(null));
147a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        } else {
148a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams            addI32(0);
149a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
150a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
151a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
152a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addF32(Float2 v) {
153a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addF32(v.x);
154a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addF32(v.y);
155a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
156a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addF32(Float3 v) {
157a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addF32(v.x);
158a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addF32(v.y);
159a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addF32(v.z);
160a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
161a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addF32(Float4 v) {
162a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addF32(v.x);
163a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addF32(v.y);
164a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addF32(v.z);
165a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addF32(v.w);
166a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
167a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
16879ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    public void addF64(Double2 v) {
16979ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addF64(v.x);
17079ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addF64(v.y);
17179ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    }
17279ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    public void addF64(Double3 v) {
17379ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addF64(v.x);
17479ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addF64(v.y);
17579ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addF64(v.z);
17679ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    }
17779ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    public void addF64(Double4 v) {
17879ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addF64(v.x);
17979ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addF64(v.y);
18079ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addF64(v.z);
18179ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addF64(v.w);
18279ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    }
18379ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines
184a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addI8(Byte2 v) {
185a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI8(v.x);
186a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI8(v.y);
187a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
188a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addI8(Byte3 v) {
189a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI8(v.x);
190a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI8(v.y);
191a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI8(v.z);
192a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
193a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addI8(Byte4 v) {
194a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI8(v.x);
195a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI8(v.y);
196a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI8(v.z);
197a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI8(v.w);
198a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
199a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
200a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addU8(Short2 v) {
201a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU8(v.x);
202a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU8(v.y);
203a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
204a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addU8(Short3 v) {
205a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU8(v.x);
206a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU8(v.y);
207a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU8(v.z);
208a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
209a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addU8(Short4 v) {
210a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU8(v.x);
211a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU8(v.y);
212a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU8(v.z);
213a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU8(v.w);
214a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
215a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
216a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addI16(Short2 v) {
217a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI16(v.x);
218a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI16(v.y);
219a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
220a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addI16(Short3 v) {
221a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI16(v.x);
222a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI16(v.y);
223a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI16(v.z);
224a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
225a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addI16(Short4 v) {
226a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI16(v.x);
227a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI16(v.y);
228a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI16(v.z);
229a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI16(v.w);
230a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
231a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
232a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addU16(Int2 v) {
233a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU16(v.x);
234a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU16(v.y);
235a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
236a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addU16(Int3 v) {
237a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU16(v.x);
238a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU16(v.y);
239a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU16(v.z);
240a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
241a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addU16(Int4 v) {
242a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU16(v.x);
243a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU16(v.y);
244a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU16(v.z);
245a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU16(v.w);
246a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
247a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
248a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addI32(Int2 v) {
249a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI32(v.x);
250a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI32(v.y);
251a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
252a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addI32(Int3 v) {
253a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI32(v.x);
254a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI32(v.y);
255a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI32(v.z);
256a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
257a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public void addI32(Int4 v) {
258a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI32(v.x);
259a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI32(v.y);
260a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI32(v.z);
261a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addI32(v.w);
262a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
263a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
264e9f5c1894bb3fd0d86b769329037790a474f14c1Stephen Hines    public void addU32(Long2 v) {
265a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU32(v.x);
266a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU32(v.y);
267a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
268e9f5c1894bb3fd0d86b769329037790a474f14c1Stephen Hines    public void addU32(Long3 v) {
269a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU32(v.x);
270a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU32(v.y);
271a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU32(v.z);
272a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
273e9f5c1894bb3fd0d86b769329037790a474f14c1Stephen Hines    public void addU32(Long4 v) {
274a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU32(v.x);
275a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU32(v.y);
276a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU32(v.z);
277a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        addU32(v.w);
278a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
279a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
28079ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    public void addI64(Long2 v) {
28179ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addI64(v.x);
28279ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addI64(v.y);
28379ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    }
28479ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    public void addI64(Long3 v) {
28579ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addI64(v.x);
28679ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addI64(v.y);
28779ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addI64(v.z);
28879ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    }
28979ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    public void addI64(Long4 v) {
29079ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addI64(v.x);
29179ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addI64(v.y);
29279ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addI64(v.z);
29379ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addI64(v.w);
29479ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    }
29579ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines
29679ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    public void addU64(Long2 v) {
29779ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addU64(v.x);
29879ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addU64(v.y);
29979ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    }
30079ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    public void addU64(Long3 v) {
30179ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addU64(v.x);
30279ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addU64(v.y);
30379ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addU64(v.z);
30479ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    }
30579ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    public void addU64(Long4 v) {
30679ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addU64(v.x);
30779ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addU64(v.y);
30879ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addU64(v.z);
30979ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines        addU64(v.w);
31079ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines    }
31179ad3f25bc224a86487aa6cf7b2c7ffe617ee77dStephen Hines
312e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    public void addMatrix(Matrix4f v) {
313e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        for (int i=0; i < v.mMat.length; i++) {
314e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            addF32(v.mMat[i]);
315e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        }
316e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
317e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
318e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    public void addMatrix(Matrix3f v) {
319e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        for (int i=0; i < v.mMat.length; i++) {
320e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            addF32(v.mMat[i]);
321e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        }
322e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
323e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
324e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    public void addMatrix(Matrix2f v) {
325e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        for (int i=0; i < v.mMat.length; i++) {
326e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            addF32(v.mMat[i]);
327e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        }
328e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
329e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
330fae3f6b4153ff39c4f9e00dcf635b413d0ae4e85Jason Sams    public void addBoolean(boolean v) {
3319e2b0c505af55a56171db0d025368e7ea6c15458Jason Sams        addI8((byte)(v ? 1 : 0));
332f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams    }
333f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams
334a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    public final byte[] getData() {
33525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        return mData;
33625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
33725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
33825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    private final byte mData[];
33925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    private int mPos;
340e27832acc083fa889e86b4c629b6aedd8855cecaStephen Hines    private int mLen;
34125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
34225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams}
34325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
34425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
345