VertexBuffer spotShadowVertexBuffer;
ShadowTessellator::tessellateSpotShadow(width, height,
- getWidth(), getHeight(), casterTransform,
- spotShadowVertexBuffer);
+ *currentTransform(), getWidth(), getHeight(),
+ casterTransform, spotShadowVertexBuffer);
drawVertexBuffer(spotShadowVertexBuffer, &paint);
return DrawGlInfo::kStatusDrew;
}
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];
#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;
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: