Mikal's Forum Posts

  • NIce work, going to check it out!

  • github.com/Scirra/Construct-3-bugs/issues/5139

    Ah! Here it is. Thanks to the user for the good due diligence to post the issue and thanks to Ashley for fixing it.

  • Thanks for the reference, looks like a ~100 USD phone. Which I would consider the lower end for NA market, but it's all relative, worldwide as you say might be mid-market.

    Yes, changing the animation rate, can save a lot of CPU perf per frame for 3D Object. For performance testing, if you will also have other moving objects like Sprites, check what the performance is like when all objects are animating how you expect. The more C3 draws, the more we need to draw the 3D Object also.

    I have also added an optimization that reduces animation CPU perf when the object is off-screen (the object is also not drawn when off-screen already.)

  • 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.

  • Try Construct 3

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

    Try Now Construct 3 users don't see these ads
  • 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

  • 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.