@@ -18,7 +18,6 @@ export default class Spine extends Renderable {
1818 runtime ;
1919 skeleton ;
2020 plugin ;
21- renderer ;
2221 animationState ;
2322 skeletonRenderer ;
2423 root ;
@@ -96,23 +95,19 @@ export default class Spine extends Renderable {
9695 "Spine plugin: plugin needs to be registered first using plugin.register" ,
9796 ) ;
9897 }
99- this . renderer = this . plugin . app . renderer ;
98+ const renderer = this . plugin . app . renderer ;
10099
101- if ( this . renderer . WebGLVersion >= 1 ) {
102- this . runtime = spineWebGL ;
103- this . gl = this . renderer . gl ;
104- this . canvas = this . renderer . renderTarget . canvas ;
105- this . context = this . renderer ;
106- this . twoColorTint = true ;
100+ /** @ignore */
101+ this . isWebGL = renderer . WebGLVersion >= 1 ;
107102
103+ if ( this . isWebGL ) {
104+ this . runtime = spineWebGL ;
105+ this . canvas = renderer . renderTarget . canvas ;
108106 // register the Spine batcher with the melonJS renderer (once)
109- if ( ! this . renderer . batchers . has ( "spine" ) ) {
110- this . renderer . addBatcher (
111- new SpineBatcher ( this . renderer , this . canvas ) ,
112- "spine" ,
113- ) ;
107+ if ( ! renderer . batchers . has ( "spine" ) ) {
108+ renderer . addBatcher ( new SpineBatcher ( renderer , this . canvas ) , "spine" ) ;
114109 }
115- this . spineBatcher = this . renderer . batchers . get ( "spine" ) ;
110+ this . spineBatcher = renderer . batchers . get ( "spine" ) ;
116111
117112 // spine skeleton renderer
118113 this . skeletonRenderer = new this . runtime . SkeletonRenderer (
@@ -197,21 +192,21 @@ export default class Spine extends Renderable {
197192 this . premultipliedAlpha = atlas . pages . some ( ( page ) => {
198193 return page . pma ;
199194 } ) ;
200- if ( this . renderer . WebGLVersion >= 1 ) {
201- this . skeletonRenderer . premultipliedAlpha = this . premultipliedAlpha ;
202- }
195+ this . skeletonRenderer . premultipliedAlpha = this . premultipliedAlpha ;
203196
204197 // Instantiate a new skeleton based on the atlas and skeleton data.
205198 this . skeleton = new this . runtime . Skeleton ( skeletonData ) ;
206199
207200 // auto-detect if the skeleton uses mesh attachments for canvas renderer
208- if ( this . skeletonRenderer instanceof SkeletonRenderer ) {
201+ if ( ! this . isWebGL ) {
209202 this . skeletonRenderer . triangleRendering = skeletonData . skins . some (
210203 ( skin ) => {
211- for ( const [ , attachments ] of skin . attachments . entries ( ) ) {
212- for ( const [ , attachment ] of attachments . entries ( ) ) {
213- if ( attachment instanceof MeshAttachment ) {
214- return true ;
204+ for ( const attachments of skin . attachments ) {
205+ if ( attachments ) {
206+ for ( const attachment of Object . values ( attachments ) ) {
207+ if ( attachment instanceof MeshAttachment ) {
208+ return true ;
209+ }
215210 }
216211 }
217212 }
@@ -274,7 +269,7 @@ export default class Spine extends Renderable {
274269 * @returns {Spine } Reference to this object for method chaining
275270 */
276271 rotate ( angle , v ) {
277- if ( this . renderer . WebGLVersion >= 1 ) {
272+ if ( this . isWebGL ) {
278273 this . skeleton . getRootBone ( ) . rotation -= Math . radToDeg ( angle ) ;
279274 } else {
280275 // rotation for rootBone is in degrees (anti-clockwise)
@@ -291,8 +286,13 @@ export default class Spine extends Renderable {
291286 * @returns {Spine } Reference to this object for method chaining
292287 */
293288 scale ( x , y = x ) {
294- this . root . scaleX *= x ;
295- this . root . scaleY *= y ;
289+ if ( this . isWebGL ) {
290+ // WebGL: SpineBatcher ignores currentTransform, scale through root bone
291+ this . root . scaleX *= x ;
292+ this . root . scaleY *= y ;
293+ }
294+ // Canvas: scale through currentTransform only (applied by preDraw),
295+ // which scales both region bone transforms and mesh world vertices uniformly
296296 return super . scale ( x , y ) ;
297297 }
298298
@@ -385,9 +385,17 @@ export default class Spine extends Renderable {
385385 * @param {CanvasRenderer|WebGLRenderer } renderer - A renderer instance.
386386 */
387387 draw ( renderer ) {
388- if ( this . renderer . WebGLVersion >= 1 ) {
388+ if ( typeof this . skeleton === "undefined" ) {
389+ return ;
390+ }
391+
392+ // apply melonJS tint to Spine skeleton color
393+ const t = this . tint . toArray ( ) ;
394+ this . skeleton . color . set ( t [ 0 ] , t [ 1 ] , t [ 2 ] , this . skeleton . color . a ) ;
395+
396+ if ( this . isWebGL ) {
389397 // switch to the Spine batcher via melonJS batcher system
390- this . renderer . setBatcher ( "spine" ) ;
398+ renderer . setBatcher ( "spine" ) ;
391399
392400 // draw the skeleton — SkeletonRenderer calls spineBatcher.draw()
393401 this . skeletonRenderer . draw (
@@ -406,7 +414,7 @@ export default class Spine extends Renderable {
406414 this . shapesShader . bind ( ) ;
407415 this . shapesShader . setUniform4x4f (
408416 this . runtime . Shader . MVP_MATRIX ,
409- this . context . projectionMatrix . val ,
417+ renderer . projectionMatrix . toArray ( ) ,
410418 ) ;
411419 this . shapes . begin ( this . shapesShader ) ;
412420 this . skeletonDebugRenderer . draw ( this . shapes , this . skeleton ) ;
@@ -425,7 +433,7 @@ export default class Spine extends Renderable {
425433 * Called automatically when the renderable is removed from the world.
426434 */
427435 dispose ( ) {
428- if ( this . renderer . WebGLVersion >= 1 ) {
436+ if ( this . isWebGL ) {
429437 this . shapes . dispose ( ) ;
430438 this . shapesShader . dispose ( ) ;
431439 this . skeletonDebugRenderer . dispose ( ) ;
0 commit comments