diff options
-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: |