// Copyright (C) 2011-2012 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #pragma version(1) #pragma rs java_package_name(com.android.scenegraph) #ifndef _TRANSFORM_DEF_ #define _TRANSFORM_DEF_ #include "rs_graphics.rsh" #define TRANSFORM_NONE 0 #define TRANSFORM_TRANSLATE 1 #define TRANSFORM_ROTATE 2 #define TRANSFORM_SCALE 3 #define CULL_FRUSTUM 0 #define CULL_ALWAYS 2 #define LIGHT_POINT 0 #define LIGHT_DIRECTIONAL 1 // Shader params that involve only data #define SHADER_PARAM_DATA_ONLY 10000 #define SHADER_PARAM_FLOAT4_DATA 10001 #define SHADER_PARAM_TRANSFORM_DATA 10002 #define SHADER_PARAM_TRANSFORM_MODEL 10003 // Shader params that involve camera #define SHADER_PARAM_CAMERA 1000 #define SHADER_PARAM_FLOAT4_CAMERA_POS 1001 #define SHADER_PARAM_FLOAT4_CAMERA_DIR 1002 #define SHADER_PARAM_TRANSFORM_VIEW 1003 #define SHADER_PARAM_TRANSFORM_PROJ 1004 #define SHADER_PARAM_TRANSFORM_VIEW_PROJ 1005 #define SHADER_PARAM_TRANSFORM_MODEL_VIEW 1006 #define SHADER_PARAM_TRANSFORM_MODEL_VIEW_PROJ 1007 // Shader Params that only involve lights #define SHADER_PARAM_LIGHT 100 #define SHADER_PARAM_FLOAT4_LIGHT_COLOR 103 #define SHADER_PARAM_FLOAT4_LIGHT_POS 104 #define SHADER_PARAM_FLOAT4_LIGHT_DIR 105 #define SHADER_PARAM_TEXTURE 10 #define TEXTURE_NONE 0 #define TEXTURE_2D 1 #define TEXTURE_CUBE 2 #define TEXTURE_RENDER_TARGET 3 typedef struct TransformComponent_s { float4 value; int type; rs_allocation name; } SgTransformComponent; typedef struct __attribute__((packed, aligned(4))) SgTransform { rs_matrix4x4 globalMat; rs_matrix4x4 localMat; rs_allocation components; int isDirty; rs_allocation children; rs_allocation name; // Used to check whether transform params need to be updated uint32_t timestamp; } SgTransform; typedef struct VertexShader_s { rs_program_vertex program; // Buffer with vertex constant data rs_allocation shaderConst; // ShaderParam's that populate data rs_allocation shaderConstParams; // location of the per object constants on the buffer int objectConstIndex; } SgVertexShader; typedef struct FragmentShader_s { rs_program_fragment program; // Buffer with vertex constant data rs_allocation shaderConst; // ShaderParam's that populate data rs_allocation shaderConstParams; // ShaderParam's that set textures rs_allocation shaderTextureParams; // location of the per object constants on the buffer int objectConstIndex; } SgFragmentShader; typedef struct RenderState_s { rs_allocation pv; // VertexShader struct rs_allocation pf; // FragmentShader struct rs_program_store ps; rs_program_raster pr; } SgRenderState; typedef struct Renderable_s { rs_allocation render_state; // Buffer with vertex constant data rs_allocation pv_const; // ShaderParam's that populate data rs_allocation pv_constParams; // Buffer with fragment constant data rs_allocation pf_const; // ShaderParam's that populate data rs_allocation pf_constParams; rs_allocation pf_textures[8]; int pf_num_textures; rs_mesh mesh; int meshIndex; rs_allocation transformMatrix; rs_allocation name; float4 boundingSphere; float4 worldBoundingSphere; int bVolInitialized; int cullType; // specifies whether to frustum cull int isVisible; } SgRenderable; typedef struct RenderPass_s { rs_allocation color_target; rs_allocation depth_target; rs_allocation camera; rs_allocation objects; float4 clear_color; float clear_depth; bool should_clear_color; bool should_clear_depth; } SgRenderPass; typedef struct Camera_s { rs_matrix4x4 proj; rs_matrix4x4 view; rs_matrix4x4 viewProj; float4 position; float near; float far; float horizontalFOV; float aspect; rs_allocation name; rs_allocation transformMatrix; float4 frustumPlanes[6]; int isDirty; // Timestamp of the camera itself to signal params if anything changes uint32_t timestamp; // Timestamp of our transform uint32_t transformTimestamp; } SgCamera; typedef struct Light_s { float4 position; float4 color; float intensity; int type; rs_allocation name; rs_allocation transformMatrix; } SgLight; // This represents the shader parameter data needed to set a float or transform data typedef struct ShaderParamData_s { int type; float4 float_value; uint32_t timestamp; rs_allocation paramName; rs_allocation camera; rs_allocation light; rs_allocation transform; rs_allocation texture; } SgShaderParamData; // This represents a shader parameter that knows how to update itself for a given // renderable or shader and contains a timestamp for the last time this buffer was updated typedef struct ShaderParam_s { // Used to check whether transform params need to be updated uint32_t transformTimestamp; // Used to check whether data params need to be updated // These are used when somebody set the matrix of float value directly in java uint32_t dataTimestamp; // Specifies where in the constant buffer data gets written to int bufferOffset; // An instance of SgShaderParamData that could be shared by multiple objects rs_allocation data; // How many components of the vector we need to write int float_vecSize; } SgShaderParam; // This represents a texture object typedef struct Texture_s { uint32_t type; rs_allocation texture; } SgTexture; static void printName(rs_allocation name) { if (!rsIsObject(name)) { rsDebug("no name", 0); return; } rsDebug((const char*)rsGetElementAt(name, 0), 0); } static void printCameraInfo(const SgCamera *cam) { rsDebug("***** Camera information. ptr:", cam); printName(cam->name); const SgTransform *camTransform = (const SgTransform *)rsGetElementAt(cam->transformMatrix, 0); rsDebug("Transform name:", camTransform); printName(camTransform->name); rsDebug("Aspect: ", cam->aspect); rsDebug("Near: ", cam->near); rsDebug("Far: ", cam->far); rsDebug("Fov: ", cam->horizontalFOV); rsDebug("Position: ", cam->position); rsDebug("Proj: ", &cam->proj); rsDebug("View: ", &cam->view); } static void printLightInfo(const SgLight *light) { rsDebug("***** Light information. ptr:", light); printName(light->name); const SgTransform *lTransform = (const SgTransform *)rsGetElementAt(light->transformMatrix, 0); rsDebug("Transform name:", lTransform); printName(lTransform->name); rsDebug("Position: ", light->position); rsDebug("Color : ", light->color); rsDebug("Intensity: ", light->intensity); rsDebug("Type: ", light->type); } static void getCameraRay(const SgCamera *cam, int screenX, int screenY, float3 *pnt, float3 *vec) { rsDebug("=================================", screenX); rsDebug("Point X", screenX); rsDebug("Point Y", screenY); rs_matrix4x4 mvpInv; rsMatrixLoad(&mvpInv, &cam->viewProj); rsMatrixInverse(&mvpInv); float width = (float)rsgGetWidth(); float height = (float)rsgGetHeight(); float4 pos = {(float)screenX, height - (float)screenY, 0.0f, 1.0f}; pos.x /= width; pos.y /= height; rsDebug("Pre Norm X", pos.x); rsDebug("Pre Norm Y", pos.y); pos.xy = pos.xy * 2.0f - 1.0f; rsDebug("Norm X", pos.x); rsDebug("Norm Y", pos.y); pos = rsMatrixMultiply(&mvpInv, pos); float oneOverW = 1.0f / pos.w; pos.xyz *= oneOverW; rsDebug("World X", pos.x); rsDebug("World Y", pos.y); rsDebug("World Z", pos.z); rsDebug("Cam X", cam->position.x); rsDebug("Cam Y", cam->position.y); rsDebug("Cam Z", cam->position.z); *vec = normalize(pos.xyz - cam->position.xyz); rsDebug("Vec X", vec->x); rsDebug("Vec Y", vec->y); rsDebug("Vec Z", vec->z); *pnt = cam->position.xyz; } static bool intersect(const SgRenderable *obj, float3 pnt, float3 vec) { // Solving for t^2 + Bt + C = 0 float3 originMinusCenter = pnt - obj->worldBoundingSphere.xyz; float B = dot(originMinusCenter, vec) * 2.0f; float C = dot(originMinusCenter, originMinusCenter) - obj->worldBoundingSphere.w * obj->worldBoundingSphere.w; float discriminant = B * B - 4.0f * C; if (discriminant < 0.0f) { return false; } discriminant = sqrt(discriminant); float t0 = (-B - discriminant) * 0.5f; float t1 = (-B + discriminant) * 0.5f; if (t0 > t1) { float temp = t0; t0 = t1; t1 = temp; } // The sphere is behind us if (t1 < 0.0f) { return false; } return true; } #endif // _TRANSFORM_DEF_