mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
[ts] Fix for physics constraint shear
This commit is contained in:
parent
9cd5b3b044
commit
cf18003c49
@ -176,7 +176,7 @@ export class PhysicsConstraint implements Updatable {
|
|||||||
if (rotateOrShearX || scaleX) {
|
if (rotateOrShearX || scaleX) {
|
||||||
let ca = Math.atan2(bone.c, bone.a), c = 0, s = 0, mr = 0;
|
let ca = Math.atan2(bone.c, bone.a), c = 0, s = 0, mr = 0;
|
||||||
if (rotateOrShearX) {
|
if (rotateOrShearX) {
|
||||||
mr = mix * this.data.rotate;
|
mr = (this.data.rotate + this.data.shearX) * mix;
|
||||||
let dx = this.cx - bone.worldX, dy = this.cy - bone.worldY, r = Math.atan2(dy + this.ty, dx + this.tx) - ca - this.rotateOffset * mr;
|
let dx = this.cx - bone.worldX, dy = this.cy - bone.worldY, r = Math.atan2(dy + this.ty, dx + this.tx) - ca - this.rotateOffset * mr;
|
||||||
this.rotateOffset += (r - Math.ceil(r * MathUtils.invPI2 - 0.5) * MathUtils.PI2) * i;
|
this.rotateOffset += (r - Math.ceil(r * MathUtils.invPI2 - 0.5) * MathUtils.PI2) * i;
|
||||||
r = this.rotateOffset * mr + ca;
|
r = this.rotateOffset * mr + ca;
|
||||||
|
|||||||
148
spine-ts/spine-webgl/example/example.css
Normal file
148
spine-ts/spine-webgl/example/example.css
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
/***
|
||||||
|
The new CSS reset - version 1.11.2 (last updated 15.11.2023)
|
||||||
|
GitHub page: https://github.com/elad2412/the-new-css-reset
|
||||||
|
***/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Remove all the styles of the "User-Agent-Stylesheet", except for the 'display' property
|
||||||
|
- The "symbol *" part is to solve Firefox SVG sprite bug
|
||||||
|
- The "html" element is excluded, otherwise a bug in Chrome breaks the CSS hyphens property (https://github.com/elad2412/the-new-css-reset/issues/36)
|
||||||
|
*/
|
||||||
|
*:where(:not(html, iframe, canvas, img, svg, video, audio):not(svg *, symbol *)) {
|
||||||
|
all: unset;
|
||||||
|
display: revert;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Preferred box-sizing value */
|
||||||
|
*,
|
||||||
|
*::before,
|
||||||
|
*::after {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fix mobile Safari increase font-size on landscape mode */
|
||||||
|
html {
|
||||||
|
-moz-text-size-adjust: none;
|
||||||
|
-webkit-text-size-adjust: none;
|
||||||
|
text-size-adjust: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reapply the pointer cursor for anchor tags */
|
||||||
|
a, button {
|
||||||
|
cursor: revert;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove list styles (bullets/numbers) */
|
||||||
|
ol, ul, menu, summary {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For images to not be able to exceed their container */
|
||||||
|
img {
|
||||||
|
max-inline-size: 100%;
|
||||||
|
max-block-size: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* removes spacing between cells in tables */
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Safari - solving issue when using user-select:none on the <body> text input doesn't working */
|
||||||
|
input, textarea {
|
||||||
|
-webkit-user-select: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* revert the 'white-space' property for textarea elements on Safari */
|
||||||
|
textarea {
|
||||||
|
white-space: revert;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* minimum style to allow to style meter element */
|
||||||
|
meter {
|
||||||
|
-webkit-appearance: revert;
|
||||||
|
appearance: revert;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* preformatted text - use only for this feature */
|
||||||
|
:where(pre) {
|
||||||
|
all: revert;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reset default text opacity of input placeholder */
|
||||||
|
::placeholder {
|
||||||
|
color: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fix the feature of 'hidden' attribute.
|
||||||
|
display:revert; revert to element instead of attribute */
|
||||||
|
:where([hidden]) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* revert for bug in Chromium browsers
|
||||||
|
- fix for the content editable attribute will work properly.
|
||||||
|
- webkit-user-select: auto; added for Safari in case of using user-select:none on wrapper element*/
|
||||||
|
:where([contenteditable]:not([contenteditable="false"])) {
|
||||||
|
-moz-user-modify: read-write;
|
||||||
|
-webkit-user-modify: read-write;
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
-webkit-line-break: after-white-space;
|
||||||
|
-webkit-user-select: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* apply back the draggable feature - exist only in Chromium and Safari */
|
||||||
|
:where([draggable="true"]) {
|
||||||
|
-webkit-user-drag: element;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Revert Modal native behavior */
|
||||||
|
:where(dialog:modal) {
|
||||||
|
all: revert;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove details summary webkit styles */
|
||||||
|
::-webkit-details-marker {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
html, body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
display: inline-block; /* Aligns like a button */
|
||||||
|
padding: 0.125em 0.5em; /* Button size */
|
||||||
|
color: #333; /* Text color */
|
||||||
|
background-color: #ccc;
|
||||||
|
border: none; /* No border */
|
||||||
|
border-radius: 5px; /* Rounded corners */
|
||||||
|
text-align: center; /* Center text */
|
||||||
|
text-decoration: none; /* No underline */
|
||||||
|
cursor: pointer; /* Cursor changes to hand symbol */
|
||||||
|
transition: background-color 0.3s, box-shadow 0.3s; /* Smooth transition for hover effect */
|
||||||
|
|
||||||
|
/* Slight shadow for depth (optional) */
|
||||||
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hover state */
|
||||||
|
.btn:hover {
|
||||||
|
background-color: #fff; /* Darker shade when hovered */
|
||||||
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); /* Larger shadow on hover */
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay {
|
||||||
|
display: flex; flex-direction: column; position: fixed; z-index: 10; top: 0; left: 0; gap: 0.5em; padding: 1em;
|
||||||
|
background-color: rgba(0, 0, 0, 0.7);
|
||||||
|
color: #ddd;
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
@ -5,22 +5,33 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
</head>
|
</head>
|
||||||
<script src="../dist/iife/spine-webgl.js"></script>
|
<script src="../dist/iife/spine-webgl.js"></script>
|
||||||
<style>
|
<link rel="stylesheet" href="example.css">
|
||||||
* {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<span id="label" style="position: fixed; z-index: 10; top: 0; left: 0; color: white; padding: 1em;"></span>
|
<div class="overlay" style="user-select: none;">
|
||||||
|
<span>Drag anywhere</span>
|
||||||
|
<span id="fps"></span>
|
||||||
|
<button id="fullscreen" class="btn">Fullscreen</div>
|
||||||
|
</div>
|
||||||
<canvas id="canvas" style="position: absolute; width: 100%; height: 100vh;"></canvas>
|
<canvas id="canvas" style="position: absolute; width: 100%; height: 100vh;"></canvas>
|
||||||
<script>
|
<script>
|
||||||
class App {
|
class App {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.skeleton = null;
|
this.skeleton = null;
|
||||||
this.animationState = null;
|
this.animationState = null;
|
||||||
this.label = document.body.querySelector("#label");
|
this.fps = document.body.querySelector("#fps");
|
||||||
|
const fsButton = document.body.querySelector("#fullscreen");
|
||||||
|
let fsEnabled = false;
|
||||||
|
fsButton.addEventListener("click", () => {
|
||||||
|
if (fsEnabled) {
|
||||||
|
document.exitFullscreen();
|
||||||
|
fsButton.innerText = "Fullscreen"
|
||||||
|
} else {
|
||||||
|
document.body.requestFullscreen()
|
||||||
|
fsButton.innerText = "Windowed";
|
||||||
|
}
|
||||||
|
fsEnabled = !fsEnabled;
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
loadAssets(canvas) {
|
loadAssets(canvas) {
|
||||||
@ -99,7 +110,7 @@
|
|||||||
this.skeleton.update(delta);
|
this.skeleton.update(delta);
|
||||||
this.skeleton.updateWorldTransform(spine.Physics.update);
|
this.skeleton.updateWorldTransform(spine.Physics.update);
|
||||||
|
|
||||||
this.label.innerText = "Click and drag anywhere (" + canvas.time.framesPerSecond.toFixed(2) + " fps)";
|
this.fps.innerText = canvas.time.framesPerSecond.toFixed(2) + " fps";
|
||||||
}
|
}
|
||||||
|
|
||||||
render(canvas) {
|
render(canvas) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user