diff options
author | Chris Craik <ccraik@google.com> | 2014-01-17 02:09:18 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-01-17 02:09:19 +0000 |
commit | 8191effc83b3ec4cfc8647a6eb16ee641fa85a2f (patch) | |
tree | b6436517e03490954add5a348a3ef1332f317e00 /libs | |
parent | ed0f7cba53be0af991fc7435549f7a798b1d377b (diff) | |
parent | 3197cded4e265bc99dc82d695bbb7163fe134ed4 (diff) | |
download | frameworks_base-8191effc83b3ec4cfc8647a6eb16ee641fa85a2f.zip frameworks_base-8191effc83b3ec4cfc8647a6eb16ee641fa85a2f.tar.gz frameworks_base-8191effc83b3ec4cfc8647a6eb16ee641fa85a2f.tar.bz2 |
Merge "Map shadow light position globally"
Diffstat (limited to 'libs')
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/ShadowTessellator.cpp | 9 | ||||
-rw-r--r-- | libs/hwui/ShadowTessellator.h | 2 |
3 files changed, 11 insertions, 4 deletions
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 4f6da2b..8fb6e38 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -3201,8 +3201,8 @@ status_t OpenGLRenderer::drawShadow(const mat4& casterTransform, float casterAlp VertexBuffer spotShadowVertexBuffer; ShadowTessellator::tessellateSpotShadow(width, height, - getWidth(), getHeight(), casterTransform, - spotShadowVertexBuffer); + *currentTransform(), getWidth(), getHeight(), + casterTransform, spotShadowVertexBuffer); drawVertexBuffer(spotShadowVertexBuffer, &paint); return DrawGlInfo::kStatusDrew; diff --git a/libs/hwui/ShadowTessellator.cpp b/libs/hwui/ShadowTessellator.cpp index ddd1c6d..b9ce872 100644 --- a/libs/hwui/ShadowTessellator.cpp +++ b/libs/hwui/ShadowTessellator.cpp @@ -85,7 +85,7 @@ void ShadowTessellator::tessellateAmbientShadow(float width, float height, } void ShadowTessellator::tessellateSpotShadow(float width, float height, - int screenWidth, int screenHeight, + const mat4& receiverTransform, int screenWidth, int screenHeight, const mat4& casterTransform, VertexBuffer& shadowVertexBuffer) { const int vertexCount = 4; Vector3 polygon[vertexCount]; @@ -101,6 +101,13 @@ void ShadowTessellator::tessellateSpotShadow(float width, float height, #if DEBUG_SHADOW ALOGD("light center %f %f %f", lightCenter.x, lightCenter.y, lightCenter.z); #endif + + // light position (because it's in local space) needs to compensate for receiver transform + // TODO: should apply to light orientation, not just position + Matrix4 reverseReceiverTransform; + reverseReceiverTransform.loadInverse(receiverTransform); + reverseReceiverTransform.mapPoint3d(lightCenter); + const float lightSize = maximal / 8; const int lightVertexCount = 16; diff --git a/libs/hwui/ShadowTessellator.h b/libs/hwui/ShadowTessellator.h index fff00b1..44ac8c0 100644 --- a/libs/hwui/ShadowTessellator.h +++ b/libs/hwui/ShadowTessellator.h @@ -30,7 +30,7 @@ public: const mat4& casterTransform, VertexBuffer& shadowVertexBuffer); static void tessellateSpotShadow(float width, float height, - int screenWidth, int screenHeight, + const mat4& receiverTransform, int screenWidth, int screenHeight, const mat4& casterTransform, VertexBuffer& shadowVertexBuffer); private: |