1a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten/* 2a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 3a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 4a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * you may not use this file except in compliance with the License. 6a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * You may obtain a copy of the License at 7a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 8a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 10a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Unless required by applicable law or agreed to in writing, software 11a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * See the License for the specific language governing permissions and 14a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * limitations under the License. 15a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten */ 16a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 17a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten/* 3DMacroscopic implementation */ 18a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 19a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "sles_allinclusive.h" 20a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 22a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DMacroscopic_SetSize(SL3DMacroscopicItf self, 23a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLmillimeter width, SLmillimeter height, SLmillimeter depth) 24a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 27d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (!((0 <= width) && (width <= SL_MILLIMETER_MAX) && 28d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten (0 <= height) && (height <= SL_MILLIMETER_MAX) && 29ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten (0 <= depth) && (depth <= SL_MILLIMETER_MAX))) { 30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 32bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DMacroscopic *thiz = (I3DMacroscopic *) self; 33bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 34bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mSize.mWidth = width; 35bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mSize.mHeight = height; 36bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mSize.mDepth = depth; 37bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 42a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 43a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 44ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 45a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DMacroscopic_GetSize(SL3DMacroscopicItf self, 46a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLmillimeter *pWidth, SLmillimeter *pHeight, SLmillimeter *pDepth) 47a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 48ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pWidth || NULL == pHeight || NULL == pDepth) { 51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 52ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 53bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DMacroscopic *thiz = (I3DMacroscopic *) self; 54bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_shared(thiz); 55bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLmillimeter width = thiz->mSize.mWidth; 56bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLmillimeter height = thiz->mSize.mHeight; 57bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLmillimeter depth = thiz->mSize.mDepth; 58bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_shared(thiz); 59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pWidth = width; 60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pHeight = height; 61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pDepth = depth; 62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 66a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 67a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 68ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 69a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DMacroscopic_SetOrientationAngles(SL3DMacroscopicItf self, 70a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLmillidegree heading, SLmillidegree pitch, SLmillidegree roll) 71a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 74d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (!((-360000 <= heading) && (heading <= 360000) && 75d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten (-90000 <= pitch) && (pitch <= 90000) && 76ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten (-360000 <= roll) && (roll <= 360000))) { 77ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 78ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 79bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DMacroscopic *thiz = (I3DMacroscopic *) self; 80bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 81bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationAngles.mHeading = heading; 82bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationAngles.mPitch = pitch; 83bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationAngles.mRoll = roll; 84bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationActive = ANGLES_SET_VECTORS_UNKNOWN; 85bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mRotatePending = SL_BOOLEAN_FALSE; 86bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten // ++thiz->mGeneration; 87bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 88ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 89ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 92a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 93a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 95a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DMacroscopic_SetOrientationVectors(SL3DMacroscopicItf self, 96a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten const SLVec3D *pFront, const SLVec3D *pAbove) 97a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 98ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 99ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pFront || NULL == pAbove) { 101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 103bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DMacroscopic *thiz = (I3DMacroscopic *) self; 104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLVec3D front = *pFront; 105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLVec3D above = *pAbove; 1067a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // NTH Check for vectors close to zero or close to parallel 107bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 108bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationVectors.mFront = front; 109bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationVectors.mAbove = above; 110bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationVectors.mUp = above; // wrong 111bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationActive = ANGLES_UNKNOWN_VECTORS_SET; 112bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mRotatePending = SL_BOOLEAN_FALSE; 113bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 115ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 116ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 117ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 118a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 119a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 120ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 121a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DMacroscopic_Rotate(SL3DMacroscopicItf self, 122a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLmillidegree theta, const SLVec3D *pAxis) 123a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 124ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 125ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 126ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!((-360000 <= theta) && (theta <= 360000)) || NULL == pAxis) { 127ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 128ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 129ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLVec3D axis = *pAxis; 1307a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // NTH Check that axis is not (close to) zero vector, length does not matter 131bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DMacroscopic *thiz = (I3DMacroscopic *) self; 132bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 133bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten while (thiz->mRotatePending) 134bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_cond_wait(thiz); 135bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mTheta = theta; 136bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mAxis = axis; 137bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mRotatePending = SL_BOOLEAN_TRUE; 138bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 140ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 141ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 143a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 144a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 145ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 146a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DMacroscopic_GetOrientationVectors(SL3DMacroscopicItf self, 147a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLVec3D *pFront, SLVec3D *pUp) 148a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 149ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 150ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pFront || NULL == pUp) { 152ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 153ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 154bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DMacroscopic *thiz = (I3DMacroscopic *) self; 155bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 156ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten for (;;) { 157bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten enum AnglesVectorsActive orientationActive = thiz->mOrientationActive; 158ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten switch (orientationActive) { 159ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case ANGLES_COMPUTED_VECTORS_SET: // not in 1.0.1 160ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case ANGLES_REQUESTED_VECTORS_SET: // not in 1.0.1 161ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case ANGLES_UNKNOWN_VECTORS_SET: 162ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case ANGLES_SET_VECTORS_COMPUTED: 163ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten { 164bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLVec3D front = thiz->mOrientationVectors.mFront; 165bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLVec3D up = thiz->mOrientationVectors.mUp; 166bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 167ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pFront = front; 168ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pUp = up; 169ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 170ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 171ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case ANGLES_SET_VECTORS_UNKNOWN: 172bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationActive = ANGLES_SET_VECTORS_REQUESTED; 173ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // fall through 174ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case ANGLES_SET_VECTORS_REQUESTED: 175ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // matched by cond_broadcast in case multiple requesters 176ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#if 0 177bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_cond_wait(thiz); 178ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#else 179bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationActive = ANGLES_SET_VECTORS_COMPUTED; 180ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#endif 181ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten continue; 182ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten default: 183bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 184ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten assert(SL_BOOLEAN_FALSE); 185ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pFront->x = 0; 186ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pFront->y = 0; 187ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pFront->z = 0; 188ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pUp->x = 0; 189ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pUp->y = 0; 190ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pUp->z = 0; 191ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 192a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten } 193a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten break; 194a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten } 195ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 196a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten } 197ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 198ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 199a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 200a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 201ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 202a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const struct SL3DMacroscopicItf_ I3DMacroscopic_Itf = { 203a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DMacroscopic_SetSize, 204a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DMacroscopic_GetSize, 205a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DMacroscopic_SetOrientationAngles, 206a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DMacroscopic_SetOrientationVectors, 207a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DMacroscopic_Rotate, 208a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DMacroscopic_GetOrientationVectors 209a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}; 210a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 211a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid I3DMacroscopic_init(void *self) 212a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 213bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DMacroscopic *thiz = (I3DMacroscopic *) self; 214bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &I3DMacroscopic_Itf; 215bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mSize.mWidth = 0; 216bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mSize.mHeight = 0; 217bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mSize.mDepth = 0; 218bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationAngles.mHeading = 0; 219bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationAngles.mPitch = 0; 220bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationAngles.mRoll = 0; 221bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten memset(&thiz->mOrientationVectors, 0x55, sizeof(thiz->mOrientationVectors)); 222bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationVectors.mFront.x = 0; 223bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationVectors.mFront.y = 0; 224bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationVectors.mFront.z = -1000; 225bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationVectors.mUp.x = 0; 226bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationVectors.mUp.y = 1000; 227bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationVectors.mUp.z = 0; 228bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationVectors.mAbove.x = 0; 229bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationVectors.mAbove.y = 0; 230bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationVectors.mAbove.z = 0; 231bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mOrientationActive = ANGLES_SET_VECTORS_COMPUTED; 232bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mTheta = 0x55555555; 233bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mAxis.x = 0x55555555; 234bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mAxis.y = 0x55555555; 235bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mAxis.z = 0x55555555; 236bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mRotatePending = SL_BOOLEAN_FALSE; 237a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 238