1// Copyright (C) 2011-2012 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//      http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#pragma version(1)
16
17#pragma rs java_package_name(com.android.scenegraph)
18
19#ifndef _TRANSFORM_DEF_
20#define _TRANSFORM_DEF_
21
22#include "rs_graphics.rsh"
23
24#define TRANSFORM_NONE      0
25#define TRANSFORM_TRANSLATE 1
26#define TRANSFORM_ROTATE    2
27#define TRANSFORM_SCALE     3
28
29#define CULL_FRUSTUM 0
30#define CULL_ALWAYS  2
31
32#define LIGHT_POINT       0
33#define LIGHT_DIRECTIONAL 1
34
35// Shader params that involve only data
36#define SHADER_PARAM_DATA_ONLY                 10000
37#define SHADER_PARAM_FLOAT4_DATA               10001
38#define SHADER_PARAM_TRANSFORM_DATA            10002
39#define SHADER_PARAM_TRANSFORM_MODEL           10003
40
41// Shader params that involve camera
42#define SHADER_PARAM_CAMERA                    1000
43#define SHADER_PARAM_FLOAT4_CAMERA_POS         1001
44#define SHADER_PARAM_FLOAT4_CAMERA_DIR         1002
45#define SHADER_PARAM_TRANSFORM_VIEW            1003
46#define SHADER_PARAM_TRANSFORM_PROJ            1004
47#define SHADER_PARAM_TRANSFORM_VIEW_PROJ       1005
48#define SHADER_PARAM_TRANSFORM_MODEL_VIEW      1006
49#define SHADER_PARAM_TRANSFORM_MODEL_VIEW_PROJ 1007
50
51// Shader Params that only involve lights
52#define SHADER_PARAM_LIGHT                     100
53#define SHADER_PARAM_FLOAT4_LIGHT_COLOR        103
54#define SHADER_PARAM_FLOAT4_LIGHT_POS          104
55#define SHADER_PARAM_FLOAT4_LIGHT_DIR          105
56
57#define SHADER_PARAM_TEXTURE                   10
58
59#define TEXTURE_NONE          0
60#define TEXTURE_2D            1
61#define TEXTURE_CUBE          2
62#define TEXTURE_RENDER_TARGET 3
63
64typedef struct TransformComponent_s {
65    float4 value;
66    int type;
67    rs_allocation name;
68} SgTransformComponent;
69
70typedef struct __attribute__((packed, aligned(4))) SgTransform {
71    rs_matrix4x4 globalMat;
72    rs_matrix4x4 localMat;
73
74    rs_allocation components;
75    int isDirty;
76
77    rs_allocation children;
78    rs_allocation name;
79
80    // Used to check whether transform params need to be updated
81    uint32_t timestamp;
82} SgTransform;
83
84typedef struct VertexShader_s {
85    rs_program_vertex program;
86    // Buffer with vertex constant data
87    rs_allocation shaderConst;
88    // ShaderParam's that populate data
89    rs_allocation shaderConstParams;
90    // location of the per object constants on the buffer
91    int objectConstIndex;
92} SgVertexShader;
93
94typedef struct FragmentShader_s {
95    rs_program_fragment program;
96    // Buffer with vertex constant data
97    rs_allocation shaderConst;
98    // ShaderParam's that populate data
99    rs_allocation shaderConstParams;
100    // ShaderParam's that set textures
101    rs_allocation shaderTextureParams;
102    // location of the per object constants on the buffer
103    int objectConstIndex;
104} SgFragmentShader;
105
106typedef struct RenderState_s {
107    rs_allocation pv; // VertexShader struct
108    rs_allocation pf; // FragmentShader struct
109    rs_program_store ps;
110    rs_program_raster pr;
111} SgRenderState;
112
113typedef struct Renderable_s {
114    rs_allocation render_state;
115    // Buffer with vertex constant data
116    rs_allocation pv_const;
117    // ShaderParam's that populate data
118    rs_allocation pv_constParams;
119    // Buffer with fragment constant data
120    rs_allocation pf_const;
121    // ShaderParam's that populate data
122    rs_allocation pf_constParams;
123    rs_allocation pf_textures[8];
124    int pf_num_textures;
125    rs_mesh mesh;
126    int meshIndex;
127    rs_allocation transformMatrix;
128    rs_allocation name;
129    float4 boundingSphere;
130    float4 worldBoundingSphere;
131    int bVolInitialized;
132    int cullType; // specifies whether to frustum cull
133    int isVisible;
134} SgRenderable;
135
136typedef struct RenderPass_s {
137    rs_allocation color_target;
138    rs_allocation depth_target;
139    rs_allocation camera;
140    rs_allocation objects;
141
142    float4 clear_color;
143    float clear_depth;
144    bool should_clear_color;
145    bool should_clear_depth;
146} SgRenderPass;
147
148typedef struct Camera_s {
149    rs_matrix4x4 proj;
150    rs_matrix4x4 view;
151    rs_matrix4x4 viewProj;
152    float4 position;
153    float near;
154    float far;
155    float horizontalFOV;
156    float aspect;
157    rs_allocation name;
158    rs_allocation transformMatrix;
159    float4 frustumPlanes[6];
160
161    int isDirty;
162    // Timestamp of the camera itself to signal params if anything changes
163    uint32_t timestamp;
164    // Timestamp of our transform
165    uint32_t transformTimestamp;
166} SgCamera;
167
168typedef struct Light_s {
169    float4 position;
170    float4 color;
171    float intensity;
172    int type;
173    rs_allocation name;
174    rs_allocation transformMatrix;
175} SgLight;
176
177// This represents the shader parameter data needed to set a float or transform data
178typedef struct ShaderParamData_s {
179    int type;
180    float4 float_value;
181    uint32_t timestamp;
182    rs_allocation paramName;
183    rs_allocation camera;
184    rs_allocation light;
185    rs_allocation transform;
186    rs_allocation texture;
187} SgShaderParamData;
188
189// This represents a shader parameter that knows how to update itself for a given
190// renderable or shader and contains a timestamp for the last time this buffer was updated
191typedef struct ShaderParam_s {
192    // Used to check whether transform params need to be updated
193    uint32_t transformTimestamp;
194    // Used to check whether data params need to be updated
195    // These are used when somebody set the matrix of float value directly in java
196    uint32_t dataTimestamp;
197    // Specifies where in the constant buffer data gets written to
198    int bufferOffset;
199    // An instance of SgShaderParamData that could be shared by multiple objects
200    rs_allocation data;
201    // How many components of the vector we need to write
202    int float_vecSize;
203} SgShaderParam;
204
205// This represents a texture object
206typedef struct Texture_s {
207    uint32_t type;
208    rs_allocation texture;
209} SgTexture;
210
211static void printName(rs_allocation name) {
212    if (!rsIsObject(name)) {
213        rsDebug("no name", 0);
214        return;
215    }
216
217    rsDebug((const char*)rsGetElementAt(name, 0), 0);
218}
219
220static void printCameraInfo(const SgCamera *cam) {
221    rsDebug("***** Camera information. ptr:", cam);
222    printName(cam->name);
223    const SgTransform *camTransform = (const SgTransform *)rsGetElementAt(cam->transformMatrix, 0);
224    rsDebug("Transform name:", camTransform);
225    printName(camTransform->name);
226
227    rsDebug("Aspect: ", cam->aspect);
228    rsDebug("Near: ", cam->near);
229    rsDebug("Far: ", cam->far);
230    rsDebug("Fov: ", cam->horizontalFOV);
231    rsDebug("Position: ", cam->position);
232    rsDebug("Proj: ", &cam->proj);
233    rsDebug("View: ", &cam->view);
234}
235
236static void printLightInfo(const SgLight *light) {
237    rsDebug("***** Light information. ptr:", light);
238    printName(light->name);
239    const SgTransform *lTransform = (const SgTransform *)rsGetElementAt(light->transformMatrix, 0);
240    rsDebug("Transform name:", lTransform);
241    printName(lTransform->name);
242
243    rsDebug("Position: ", light->position);
244    rsDebug("Color : ", light->color);
245    rsDebug("Intensity: ", light->intensity);
246    rsDebug("Type: ", light->type);
247}
248
249static void getCameraRay(const SgCamera *cam, int screenX, int screenY, float3 *pnt, float3 *vec) {
250    rsDebug("=================================", screenX);
251    rsDebug("Point X", screenX);
252    rsDebug("Point Y", screenY);
253
254    rs_matrix4x4 mvpInv;
255    rsMatrixLoad(&mvpInv, &cam->viewProj);
256    rsMatrixInverse(&mvpInv);
257
258    float width = (float)rsgGetWidth();
259    float height = (float)rsgGetHeight();
260
261    float4 pos = {(float)screenX, height - (float)screenY, 0.0f, 1.0f};
262
263    pos.x /= width;
264    pos.y /= height;
265
266    rsDebug("Pre Norm X", pos.x);
267    rsDebug("Pre Norm Y", pos.y);
268
269    pos.xy = pos.xy * 2.0f - 1.0f;
270
271    rsDebug("Norm X", pos.x);
272    rsDebug("Norm Y", pos.y);
273
274    pos = rsMatrixMultiply(&mvpInv, pos);
275    float oneOverW = 1.0f / pos.w;
276    pos.xyz *= oneOverW;
277
278    rsDebug("World X", pos.x);
279    rsDebug("World Y", pos.y);
280    rsDebug("World Z", pos.z);
281
282    rsDebug("Cam X", cam->position.x);
283    rsDebug("Cam Y", cam->position.y);
284    rsDebug("Cam Z", cam->position.z);
285
286    *vec = normalize(pos.xyz - cam->position.xyz);
287    rsDebug("Vec X", vec->x);
288    rsDebug("Vec Y", vec->y);
289    rsDebug("Vec Z", vec->z);
290    *pnt = cam->position.xyz;
291}
292
293static bool intersect(const SgRenderable *obj, float3 pnt, float3 vec) {
294    // Solving for t^2 + Bt + C = 0
295    float3 originMinusCenter = pnt - obj->worldBoundingSphere.xyz;
296    float B = dot(originMinusCenter, vec) * 2.0f;
297    float C = dot(originMinusCenter, originMinusCenter) -
298              obj->worldBoundingSphere.w * obj->worldBoundingSphere.w;
299
300    float discriminant = B * B - 4.0f * C;
301    if (discriminant < 0.0f) {
302        return false;
303    }
304    discriminant = sqrt(discriminant);
305
306    float t0 = (-B - discriminant) * 0.5f;
307    float t1 = (-B + discriminant) * 0.5f;
308
309    if (t0 > t1) {
310        float temp = t0;
311        t0 = t1;
312        t1 = temp;
313    }
314
315    // The sphere is behind us
316    if (t1 < 0.0f) {
317        return false;
318    }
319    return true;
320}
321
322
323#endif // _TRANSFORM_DEF_
324