Skip to content

Commit

Permalink
[ts] Fix for physics constraint shear
Browse files Browse the repository at this point in the history
  • Loading branch information
badlogic committed Dec 5, 2023
1 parent 9cd5b3b commit cf18003
Show file tree
Hide file tree
Showing 3 changed files with 169 additions and 10 deletions.
2 changes: 1 addition & 1 deletion spine-ts/spine-core/src/PhysicsConstraint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
148 changes: 148 additions & 0 deletions spine-ts/spine-webgl/example/example.css
Original file line number Diff line number Diff line change
@@ -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;
}
29 changes: 20 additions & 9 deletions spine-ts/spine-webgl/example/physics2.html
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit cf18003

Please sign in to comment.