mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-02-19 08:16:41 +08:00
[unity] SkeletonRenderTexture classes not displaying on Vulkan. Fixed negative viewport offsets for ortho and perspective projections. Closes #2535.
This commit is contained in:
parent
acd4b1eb98
commit
63dc7d1bb8
@ -260,24 +260,30 @@ namespace Spine.Unity.Examples {
|
||||
commandBuffer.SetRenderTarget(renderTexture);
|
||||
commandBuffer.ClearRenderTarget(true, true, Color.clear);
|
||||
|
||||
Rect canvasRect = skeletonGraphic.canvas.pixelRect;
|
||||
|
||||
Matrix4x4 projectionMatrix = Matrix4x4.Ortho(
|
||||
canvasRect.x, canvasRect.x + canvasRect.width,
|
||||
canvasRect.y, canvasRect.y + canvasRect.height,
|
||||
float.MinValue, float.MaxValue);
|
||||
Vector2 targetViewportSize = new Vector2(
|
||||
screenSpaceMax.x - screenSpaceMin.x,
|
||||
screenSpaceMax.y - screenSpaceMin.y);
|
||||
|
||||
RenderMode canvasRenderMode = skeletonGraphic.canvas.renderMode;
|
||||
if (canvasRenderMode == RenderMode.ScreenSpaceOverlay) {
|
||||
Rect canvasRect = skeletonGraphic.canvas.pixelRect;
|
||||
canvasRect.x += screenSpaceMin.x;
|
||||
canvasRect.y += screenSpaceMin.y;
|
||||
canvasRect.width = targetViewportSize.x;
|
||||
canvasRect.height = targetViewportSize.y;
|
||||
Matrix4x4 projectionMatrix = Matrix4x4.Ortho(
|
||||
canvasRect.x, canvasRect.x + canvasRect.width,
|
||||
canvasRect.y, canvasRect.y + canvasRect.height,
|
||||
float.MinValue, float.MaxValue);
|
||||
commandBuffer.SetViewMatrix(Matrix4x4.identity);
|
||||
commandBuffer.SetProjectionMatrix(projectionMatrix);
|
||||
} else {
|
||||
commandBuffer.SetViewMatrix(targetCamera.worldToCameraMatrix);
|
||||
commandBuffer.SetProjectionMatrix(targetCamera.projectionMatrix);
|
||||
Matrix4x4 projectionMatrix = CalculateProjectionMatrix(targetCamera,
|
||||
screenSpaceMin, screenSpaceMax, skeletonGraphic.canvas.pixelRect.size);
|
||||
commandBuffer.SetProjectionMatrix(projectionMatrix);
|
||||
}
|
||||
|
||||
Vector2 targetCameraViewportSize = targetCamera.pixelRect.size;
|
||||
Rect viewportRect = new Rect(-screenSpaceMin * downScaleFactor, targetCameraViewportSize * downScaleFactor);
|
||||
Rect viewportRect = new Rect(Vector2.zero, targetViewportSize * downScaleFactor);
|
||||
commandBuffer.SetViewport(viewportRect);
|
||||
}
|
||||
|
||||
|
||||
@ -179,10 +179,16 @@ namespace Spine.Unity.Examples {
|
||||
commandBuffer.SetRenderTarget(renderTexture);
|
||||
commandBuffer.ClearRenderTarget(true, true, Color.clear);
|
||||
|
||||
commandBuffer.SetProjectionMatrix(targetCamera.projectionMatrix);
|
||||
commandBuffer.SetViewMatrix(targetCamera.worldToCameraMatrix);
|
||||
Vector2 targetCameraViewportSize = targetCamera.pixelRect.size;
|
||||
Rect viewportRect = new Rect(-screenSpaceMin * downScaleFactor, targetCameraViewportSize * downScaleFactor);
|
||||
|
||||
Matrix4x4 projectionMatrix = CalculateProjectionMatrix(targetCamera,
|
||||
screenSpaceMin, screenSpaceMax, targetCamera.pixelRect.size);
|
||||
commandBuffer.SetProjectionMatrix(projectionMatrix);
|
||||
|
||||
Vector2 targetViewportSize = new Vector2(
|
||||
screenSpaceMax.x - screenSpaceMin.x,
|
||||
screenSpaceMax.y - screenSpaceMin.y);
|
||||
Rect viewportRect = new Rect(Vector2.zero, targetViewportSize * downScaleFactor);
|
||||
commandBuffer.SetViewport(viewportRect);
|
||||
}
|
||||
|
||||
|
||||
@ -122,6 +122,45 @@ namespace Spine.Unity.Examples {
|
||||
}
|
||||
}
|
||||
|
||||
protected Matrix4x4 CalculateProjectionMatrix (Camera targetCamera,
|
||||
Vector3 screenSpaceMin, Vector3 screenSpaceMax, Vector2 fullSizePixels) {
|
||||
if (targetCamera.orthographic)
|
||||
return CalculateOrthoMatrix(targetCamera, screenSpaceMin, screenSpaceMax, fullSizePixels);
|
||||
else
|
||||
return CalculatePerspectiveMatrix(targetCamera, screenSpaceMin, screenSpaceMax, fullSizePixels);
|
||||
}
|
||||
|
||||
protected Matrix4x4 CalculateOrthoMatrix (Camera targetCamera,
|
||||
Vector3 screenSpaceMin, Vector3 screenSpaceMax, Vector2 fullSizePixels) {
|
||||
|
||||
Vector2 cameraSize = new Vector2(
|
||||
targetCamera.orthographicSize * 2.0f * targetCamera.aspect,
|
||||
targetCamera.orthographicSize * 2.0f);
|
||||
Vector2 min = new Vector2(screenSpaceMin.x, screenSpaceMin.y) / fullSizePixels;
|
||||
Vector2 max = new Vector2(screenSpaceMax.x, screenSpaceMax.y) / fullSizePixels;
|
||||
Vector2 centerOffset = new Vector2(-0.5f, -0.5f);
|
||||
min = (min + centerOffset) * cameraSize;
|
||||
max = (max + centerOffset) * cameraSize;
|
||||
|
||||
return Matrix4x4.Ortho(min.x, max.x, min.y, max.y, float.MinValue, float.MaxValue);
|
||||
}
|
||||
|
||||
protected Matrix4x4 CalculatePerspectiveMatrix (Camera targetCamera,
|
||||
Vector3 screenSpaceMin, Vector3 screenSpaceMax, Vector2 fullSizePixels) {
|
||||
|
||||
FrustumPlanes frustumPlanes = targetCamera.projectionMatrix.decomposeProjection;
|
||||
Vector2 planesSize = new Vector2(
|
||||
frustumPlanes.right - frustumPlanes.left,
|
||||
frustumPlanes.top - frustumPlanes.bottom);
|
||||
Vector2 min = new Vector2(screenSpaceMin.x, screenSpaceMin.y) / fullSizePixels * planesSize;
|
||||
Vector2 max = new Vector2(screenSpaceMax.x, screenSpaceMax.y) / fullSizePixels * planesSize;
|
||||
frustumPlanes.right = frustumPlanes.left + max.x;
|
||||
frustumPlanes.top = frustumPlanes.bottom + max.y;
|
||||
frustumPlanes.left += min.x;
|
||||
frustumPlanes.bottom += min.y;
|
||||
return Matrix4x4.Frustum(frustumPlanes);
|
||||
}
|
||||
|
||||
protected void AssignAtQuad () {
|
||||
Transform quadTransform = quad.transform;
|
||||
quadTransform.position = this.transform.position;
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
"name": "com.esotericsoftware.spine.spine-unity-examples",
|
||||
"displayName": "spine-unity Runtime Examples",
|
||||
"description": "This plugin provides example scenes and scripts for the spine-unity runtime.",
|
||||
"version": "4.2.31",
|
||||
"version": "4.2.32",
|
||||
"unity": "2018.3",
|
||||
"author": {
|
||||
"name": "Esoteric Software",
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user