Mikal's Recent Forum Activity

  • The feature is widely used. In our game, it’s one of the draws for the game, highly customizable characters (our game is a MMO brawler, C3 client Colyseus server). It’s also a key part of our monetization (purchasing dyes to color different parts of the player skins). We also use the Spine skins feature for further customization.

    Each character is made of many quads to allow for lots of customization and players tend to color different part of the characters differently, so if an effect was used, we would need to change the FS uniforms and that would break the batching.

    Perhaps our solution will be to stay with the webgl version of C3 (our favorite game engine). Will that be an option for a while? Similar to how we can still choose to enable worker mode or not?

    I am definitely open to other ideas on this, so if there are alternatives for implementation I am willing to put in the hard work, porting shaders as needed or learning webGPU or using new feature of the new C3 renderer, etc.

  • Is there a plug-in option you can expose for the color ACEs and color property for plug-ins (which uses the built-in color uniform in the default FS?) For example what Sprite and 3D Shape have available?

  • Yes rotating is similar to animation, whenever you change a lot of points of a complex model, the CPU must do a lot of calculations. When you say changing speed, do mean mean animation rate or something else?

    What mobile are you testing on? Mobile model and year? I am trying to gauge the performance of the platform. On my iPhone 12 the perf is good, but obviously higher end mobile.

  • It applies the above fragment shader, it’s applied uniformly across the image. So it’s not depending on uv position. It only depends on the texture color and the color and color2 which are passed into VS and then to the FS. Each Spine object cab be made of 100 to 1000 quads (actually triangles) when enabling mesh deform. So batching is important. The color data is passed into vertex buffer, so FS uniforms don’t change.

  • Ok, understood. As WebGPU comes online with C3, I'll focus on seeing if we can change Spine plugin to work directly with the IWebGLRenderer, good to know it will be forward-compatible with WebGPU.

    Using the IWebGLRenderer, one of the issues I will need to resolve is that in Spine, each Quad can be two color-tinted differently (normal color and dark color). This allows the different attachments in Spine to be colored according to gameplay or user choice dynamically.

    To keep WebGL draw batching efficient, in the Spine WebGL renderer these tint colors are passed as vertex colors to the fragment shader ('varying'), instead of doing different fragment uniforms which would break batching.

    I am not sure how to approach that with IWebGLRenderer as it is currently defined. Any ideas?

    Here's the shader used in the Spine WebGL renderer:

    			let vs = `
    				attribute vec4 ${Shader.POSITION};
    				attribute vec4 ${Shader.COLOR};
    				attribute vec4 ${Shader.COLOR2};
    				attribute vec2 ${Shader.TEXCOORDS};
    				uniform mat4 ${Shader.MVP_MATRIX};
    				varying vec4 v_light;
    				varying vec4 v_dark;
    				varying vec2 v_texCoords;
    				void main () {
    					v_light = ${Shader.COLOR};
    					v_dark = ${Shader.COLOR2};
    					v_texCoords = ${Shader.TEXCOORDS};
    					gl_Position = ${Shader.MVP_MATRIX} * ${Shader.POSITION};
    				}
    			`;
    
    			let fs = `
    				#ifdef GL_ES
    					#define LOWP lowp
    					precision mediump float;
    				#else
    					#define LOWP
    				#endif
    				varying LOWP vec4 v_light;
    				varying LOWP vec4 v_dark;
    				varying vec2 v_texCoords;
    				uniform sampler2D u_texture;
    				void main () {
    					vec4 texColor = texture2D(u_texture, v_texCoords);
    					gl_FragColor.a = texColor.a * v_light.a;
    					gl_FragColor.rgb = ((texColor.a - 1.0) * v_dark.a + 1.0 - texColor.rgb) * v_dark.rgb + texColor.rgb * v_light.rgb;
    				}
    			`;
    
  • Ok, thanks, good to know, if I see the issue myself, I'll file a bug report.

  • Thanks Ashley for the response, yes I was not concerned about whether Draw() was called or not, I was thinking more about the processing I was doing for animation (I want some of it to continue, but not all the detailed processing, if it's not being rendered / on screen.)

    I will take a look at implementing a check if Draw() has been called in the last few ticks (probably a simple shift register like array pushed by Draw() and popped by Tick() )

  • I think this requested SDK method is similar to the Common ACE Is on-screen - which looks to work for both 3D and 2D.

  • It takes a bit more work compared to 3D Shape, but you could try my 3D Object plug-in. You will need to create a gltf 3D Model and texture.

    construct.net/en/forum/construct-3/general-discussion-7/3d-object-gltf-3d-model-163781

  • Try Construct 3

    Develop games in your browser. Powerful, performant & highly capable.

    Try Now Construct 3 users don't see these ads
  • Is there an plug-in SDK method to check if an object is within the 3D camera viewport?

    For example, how the engine might determine using the 3D Shape's x, y, z elevation, bbox, and z height if Draw() should be called or not (I'm not sure how it's done, just guessing.)

    I want to check if my 3D Object is visible or not depending on the camera location and orientation. If it is, I want to have the option to pause animations to save CPU cycles.

    For 2D I used to do the below, but, this is not applicable for 3D.

     let wi = this.GetWorldInfo();
     let layerRect = wi.GetLayer().GetViewport();
     let instanceRect = wi.GetBoundingBox();
     let onScreen = instanceRect.intersectsRect(layerRect);
    
  • I am not sure if this behavior is the same for webGPU, but I imagine it may be similar, so I wanted to discuss first before adding an aha suggestion.

    Ashley

    In the current Spine plugin, I share WebGL context with the C3 renderer and the Spine WebGL renderer. To do this, I save off certain WebGL parameters that C3 is using, render using the Spine WebGL renderer and then restore the WebGL parameters. I use the same context to render to texture for C3 use, for better performance. The save parameters is a blocking WebGL operation, but I need to do it because I don't have access to any shadow parameters from the C3 engine. This is all relatively ok and it works, but has perf impact.

    If there is a new webgpu renderer coming for C3, would it be possible to include a save and restore set of methods, so the C3 webgpu renderer can coexist with another webgpu renderer in the same 'context'? For example for the Spine renderer or other renderer. I have never implemented anything in webgpu yet, so I won't be shocked if I make bad assumptions, but I wanted to start the conversation.

  • Have there been any recent changes in the effect compositor? I have heard reports of a couple of the effects that I work on behaving differently recently. Were there changes to any of the default uniforms or U/V min/max range? I also noticed there were some changes reported to one or two of the built-in effects.

Mikal's avatar

Mikal

Early Adopter

Member since 22 Apr, 2016

Twitter
Mikal has 112 followers

Trophy Case

  • 9-Year Club
  • Entrepreneur Sold something in the asset store
  • Jupiter Mission Supports Gordon's mission to Jupiter
  • Forum Contributor Made 100 posts in the forums
  • Forum Patron Made 500 posts in the forums
  • Forum Hero Made 1,000 posts in the forums
  • Popular Game One of your games has over 1,000 players
  • Regular Visitor Visited Construct.net 7 days in a row
  • Steady Visitor Visited Construct.net 30 days in a row
  • RTFM Read the fabulous manual
  • x10
    Great Comment One of your comments gets 3 upvotes
  • Delicious Comment One of your comments gets 10 upvotes
  • Email Verified

Progress

21/44
How to earn trophies