- This topic has 17 replies, 4 voices, and was last updated 4 years, 1 month ago by precismo.
-
AuthorPosts
-
2019-06-14 at 11:58 pm #15671scalareCustomer
Hello all!
As you may know already, I’m working on a configurator. We’re doing some final tweaks right now. This is one of them. We’re applying several changes to geometry (hide/show) and materials based on user interaction in the HTML page that holds the verge3d file, and they are applied one by one via runCode calls. The problem is that we don’t like to be able to see each of those steps reflected in the 3d viewport. We’d prefer to see all the changes applied together. Apparently, because we are making several calls via runCode, there is some delay when executing them, and we are able to tell each of the visual changes. So, for example, we have two types of beds. Via interaction in the html page, we need to be able to change the type of bed (regular bed to crib) and material (oak to beech). We’d like both to change at the same time, and pass from a regular oak bed, to a beech crib. Instead of that, we’re seeing how the bed is hidden and replaced by the crib, and just after that, the material is changed.
So, we were trying to stop rendering before starting with the calls, using the “disable rendering” puzzle, and the “enable rendering” when the calls are done (and we were planning to show a spinning animation on top of the verge3d canvas via javascript while the changes take place without them being visible). However, the results we get with the “disable rendering” are not what we were expecting. We’re actually able to see the changes even with the disable rendering puzzle applied. Am I interpreting wrong how it is supposed to work? And if that is not what the puzzle does, is there any other way to control this? It would be OK if it had to be some javascript snippet if that is the only way to accomplish that.
I hope the explanation makes sense, and thank you for your help in advance!
2019-06-15 at 12:49 am #15672elkCustomerNot shure if I am getting all you are saying, but if you are changing materials and models after the app has loaded you should be using the prepareExternalInterface function (https://www.soft8soft.com/docs/manual/en/introduction/Using-JavaScript.html#Method_2_Versatile) and not runCode i think. runCode is supossed to be run once when your app starts. stoping and starting your rendering should work as you say. so i would put some puzzles like event->stop render->change material and model(via ExternalInterface if you want to do it like that, and you should be able to run several if you need to)->re-start render. Have not tested this, but somthing like this should be doing what you need i think. If you don’t want to stop the render while switching i think you should be able to swap materials and stuff while an object is still hiden, so you can make al the changes to your “new” object before hiding the “old” one. Hope that makes sens and is helpfull, or I am sure the Verge team will have some more insight to fill in some gaps.
2019-06-15 at 10:22 am #15677Yuri KovelenovStaff2019-06-15 at 11:48 am #15679elkCustomerAhh, I think i got the camera rotation to update while in “render disabled” mode, so I wrongly assumed that other stuff would update to. Thanks for clarifying that Yuri.
2019-06-15 at 1:03 pm #15681scalareCustomerThanks Elk and Yuri! So there is no way to do what we need? Not even through three.js code?
2019-06-15 at 1:48 pm #15682scalareCustomerElk, thank you for your suggestions. I should have said that we figured out a way to use runCode function AFTER the initial load, which lets us communicate with the puzzles when some events happen at the HTML side. We actually use prepareExternalInterface function for communications in the other way, when an event in the 3D view needs something from the HTML page that holds it.
2019-06-16 at 12:05 pm #15688elkCustomerHmm, ok. As you are going against conventions here, it is kinda hard to figure out what might be wrong. If you are somehow using events or something to call code in run my first thought is that it somehow gets queud so it will only update on consecutive frames, is it just like a one frame “flash” for each thing you update? Maybe try to using fewer calls and do all updates in the same block of code. Even if that is not an option in the final product just try with some conciser code that will update a product 10 seconds after app has loaded for instance, just to try and isolate the issue. If you can reproduce how you have set this up in a smaller example, and post it on the network with some screenshots and stuff it might be easier to see what is going on.
2019-06-17 at 12:24 pm #15692scalareCustomerHi elk, unfortunately, it is not easy to create a small example for this, as it needs interaction with the e-commerce part which runs based on html/php.
Here is another idea: would it be possible to create a screenshot of the 3d view before we start with the changes, and use it as a mask that we would display on top of everything else, covering the changes that are done to the geometry/materials until we’re done with that, and then we remove it to be able to see the changes that were done? I know that screenshots can be taken, but I’m not sure of how to display them and make them match the 3d viewport size. Any ideas?
Thanks again!
2019-06-17 at 5:19 pm #15695elkCustomerI see. Well in esence this is exactly what the disable/enable rendering should do. All it does, and the Verge team might correct me on the fine details here, is to not update the buffer or whatever aslong as the rendering is disabled, basicaly holding the last frame as a screenshot. As long as you don’t clear the buffer or write anything new to it it should stay unchanged until you re-enable rendering. But that is neither here nor there if disabled renderer will prevent the scene form being updated like Yuri said. Then you would probably have to manualy stor the buffer and force it as the last update before finalising the renderloop, or even map it to a shaderless mesh right in front of your camera or something.
A quicker and maybe not so elegant way would be to have your changes made to an object of screen, if you can hide it under the floor or somewhere out of sight whiles you make the changes, even scaling it down to make it fit inside something else, and then swap it with the old object in one go, when all is set up ? basicaly just set position of new object to the old objects position, and the old object position to the of screen location where the new one was set up. Doing this in two cosecutive lines of code should make the change in location between the same two consecutive render loops/frames.
Might that be a posible solution? Not very elegant, but then again 3D stuff is mostyly about cheating your way around limitations anyway ;)
2019-06-17 at 6:02 pm #15696scalareCustomerBut that is neither here nor there if disabled renderer will prevent the scene form being updated like Yuri said.
Exactly. Based on what Yuri said, it would work as long as you don’t make any changes to the object in the 3d view, which is exactly what we need to do.
Your idea about swaping objects is a good one. Visually, it would perform in the same way as the disable/enable rendering should, but I’m concerned about the additional coding we would have to create, because we need this to work dynamically, and adapt to any product in the store, not just for a fixed product like the scooter example, where just one product is customizable and all the references to objects have been hardcoded in the puzzles.
So I think I would prefer to go with the manipulation of the buffer or the creation of a screenshot that covers what is being changed until everything is done. I hope Verge3D team can chime in about that.
Thanks a lot! :)
2019-06-17 at 6:14 pm #15697elkCustomerThe buffer stuff was not really a serious suggestion, but yeah, If you have names and stuff hardcoded in puzzles, depending on how you set it up, that might become a problem. Always a good idea to make procedures or functions when you do more than 2-3 of anything, that way you only need to update the procedures/functions to add functionality. And that is where puzzles falls a bit short, for my taste anyway, when it comes to bigger projects.
But good luck whatever you deside. Hope you figure out a solution that works for you.
2019-06-18 at 1:44 am #15710scalareCustomerOK, first attempt with the “manual” screenshot and I’m getting a weird result. I’ve created a quick example, with two cubes. Nothing fancy. A div of 500×500 pixels that shows the 3d viewport, and another div with red background, with the same size, 100 pixels to the right (I made it red to make it really clear that the background would change)
When you click on the cube on the right (the one that shows at the right when you open the app.), the puzzle takes a snapshot, and sets it as background image for the div at the right. But instead of “repeating” the viewport as a static image, I just get a black background.I assume that if I manage to make this work, I should be able to display a div on top of the viewport, matching its size, with the snapshot as a background. Doing so, I would not have to worry about being able to display the snapshot as a texture for an object inside the 3d viewport.
I’m using this as an example: https://www.soft8soft.com/docs/manual/en/introduction/Puzzles.html#take_screenshot
I’ve also tried to view the generated snapshot using these tools:
http://jaredwinick.github.io/base64-image-viewer/
https://www.site24x7.com/tools/datauri-to-image.html
but none of them was able to display an image.Attaching the full app.
Yuri and team, can you please tell me if I missing something? Thank you!
2019-06-20 at 3:44 pm #15769scalareCustomerHi Yuri, any chance you can take a look at the example I uploaded a few days ago? Thank you!
2019-06-24 at 6:59 am #15812Yuri KovelenovStaffSorry for not replying earlier. A thorough investigating of this question would require diverting one of the developers from their work. We, however, would be happy to assist you under the terms of technical support plan (also available as part of the Enterprise option).
2019-06-24 at 12:12 pm #15822scalareCustomerThanks Yuri. I’m not actually worried about our javascript coding right now. You’ve already explained that the disable rendering would not do what we want if we make changes to the viewport via javascript, which is what we are doing. We actually plan to finally buy Verge3d later this week.
But I’m concerned about the “take snapshot” puzzle that did not create a valid image (which is the alternate route we think may come up handy for us). I did not test that with previous versions, but could it be possible it is not working right in the latest verge3d version?
Thanks again.
-
AuthorPosts
- You must be logged in to reply to this topic.