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