OSDN Git Service

Map shadow light position globally
authorChris Craik <ccraik@google.com>
Thu, 16 Jan 2014 22:03:39 +0000 (14:03 -0800)
committerChris Craik <ccraik@google.com>
Thu, 16 Jan 2014 22:03:39 +0000 (14:03 -0800)
Change-Id: Ic3201cecdf5d2a1dd628e7e40aee912ef516d3b2

libs/hwui/OpenGLRenderer.cpp
libs/hwui/ShadowTessellator.cpp
libs/hwui/ShadowTessellator.h

index 4f6da2b..8fb6e38 100644 (file)
@@ -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;
index 6385ef7..9d9ce46 100644 (file)
@@ -90,7 +90,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];
@@ -106,6 +106,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;
 
index fff00b1..44ac8c0 100644 (file)
@@ -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: