Browse Source

[ts] Fix for physics constraint shear

Mario Zechner 1 year ago
parent
commit
cf18003c49

+ 1 - 1
spine-ts/spine-core/src/PhysicsConstraint.ts

@@ -176,7 +176,7 @@ export class PhysicsConstraint implements Updatable {
 					if (rotateOrShearX || scaleX) {
 						let ca = Math.atan2(bone.c, bone.a), c = 0, s = 0, mr = 0;
 						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;
 							this.rotateOffset += (r - Math.ceil(r * MathUtils.invPI2 - 0.5) * MathUtils.PI2) * i;
 							r = this.rotateOffset * mr + ca;

+ 148 - 0
spine-ts/spine-webgl/example/example.css

@@ -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;
+}

+ 20 - 9
spine-ts/spine-webgl/example/physics2.html

@@ -5,22 +5,33 @@
 	<meta name="viewport" content="width=device-width, initial-scale=1.0">
 </head>
 <script src="../dist/iife/spine-webgl.js"></script>
-<style>
-	* {
-		margin: 0;
-		padding: 0;
-	}
-</style>
+<link rel="stylesheet" href="example.css">
 
 <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>
 	<script>
 		class App {
 			constructor() {
 				this.skeleton = 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) {
@@ -99,7 +110,7 @@
 				this.skeleton.update(delta);
 				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) {