mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +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.SetRenderTarget(renderTexture);
|
||||||
commandBuffer.ClearRenderTarget(true, true, Color.clear);
|
commandBuffer.ClearRenderTarget(true, true, Color.clear);
|
||||||
|
|
||||||
Rect canvasRect = skeletonGraphic.canvas.pixelRect;
|
Vector2 targetViewportSize = new Vector2(
|
||||||
|
screenSpaceMax.x - screenSpaceMin.x,
|
||||||
Matrix4x4 projectionMatrix = Matrix4x4.Ortho(
|
screenSpaceMax.y - screenSpaceMin.y);
|
||||||
canvasRect.x, canvasRect.x + canvasRect.width,
|
|
||||||
canvasRect.y, canvasRect.y + canvasRect.height,
|
|
||||||
float.MinValue, float.MaxValue);
|
|
||||||
|
|
||||||
RenderMode canvasRenderMode = skeletonGraphic.canvas.renderMode;
|
RenderMode canvasRenderMode = skeletonGraphic.canvas.renderMode;
|
||||||
if (canvasRenderMode == RenderMode.ScreenSpaceOverlay) {
|
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.SetViewMatrix(Matrix4x4.identity);
|
||||||
commandBuffer.SetProjectionMatrix(projectionMatrix);
|
commandBuffer.SetProjectionMatrix(projectionMatrix);
|
||||||
} else {
|
} else {
|
||||||
commandBuffer.SetViewMatrix(targetCamera.worldToCameraMatrix);
|
commandBuffer.SetViewMatrix(targetCamera.worldToCameraMatrix);
|
||||||
commandBuffer.SetProjectionMatrix(targetCamera.projectionMatrix);
|
Matrix4x4 projectionMatrix = CalculateProjectionMatrix(targetCamera,
|
||||||
|
screenSpaceMin, screenSpaceMax, skeletonGraphic.canvas.pixelRect.size);
|
||||||
|
commandBuffer.SetProjectionMatrix(projectionMatrix);
|
||||||
}
|
}
|
||||||
|
Rect viewportRect = new Rect(Vector2.zero, targetViewportSize * downScaleFactor);
|
||||||
Vector2 targetCameraViewportSize = targetCamera.pixelRect.size;
|
|
||||||
Rect viewportRect = new Rect(-screenSpaceMin * downScaleFactor, targetCameraViewportSize * downScaleFactor);
|
|
||||||
commandBuffer.SetViewport(viewportRect);
|
commandBuffer.SetViewport(viewportRect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -179,10 +179,16 @@ namespace Spine.Unity.Examples {
|
|||||||
commandBuffer.SetRenderTarget(renderTexture);
|
commandBuffer.SetRenderTarget(renderTexture);
|
||||||
commandBuffer.ClearRenderTarget(true, true, Color.clear);
|
commandBuffer.ClearRenderTarget(true, true, Color.clear);
|
||||||
|
|
||||||
commandBuffer.SetProjectionMatrix(targetCamera.projectionMatrix);
|
|
||||||
commandBuffer.SetViewMatrix(targetCamera.worldToCameraMatrix);
|
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);
|
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 () {
|
protected void AssignAtQuad () {
|
||||||
Transform quadTransform = quad.transform;
|
Transform quadTransform = quad.transform;
|
||||||
quadTransform.position = this.transform.position;
|
quadTransform.position = this.transform.position;
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
"name": "com.esotericsoftware.spine.spine-unity-examples",
|
"name": "com.esotericsoftware.spine.spine-unity-examples",
|
||||||
"displayName": "spine-unity Runtime Examples",
|
"displayName": "spine-unity Runtime Examples",
|
||||||
"description": "This plugin provides example scenes and scripts for the spine-unity runtime.",
|
"description": "This plugin provides example scenes and scripts for the spine-unity runtime.",
|
||||||
"version": "4.2.31",
|
"version": "4.2.32",
|
||||||
"unity": "2018.3",
|
"unity": "2018.3",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Esoteric Software",
|
"name": "Esoteric Software",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user