EntityOrder problem
Blitz3D Forums/Blitz3D Programming/EntityOrder problem
| ||
I'm doing an FPS and I want to have the player's gun always visible, so I gave it EntityOrder -1. The problem is that the mesh now does not display correctly, as if the entity order "inside" the mesh didn't work. That is, some parts of the mesh are drawn atop others although they shouldn't. Sorry, I don't know how to describe this better... any ideas? -kungfista |
| ||
any ideas? You really need to sort your sig out, its a mess. |
| ||
done :) |
| ||
I dont have B3D but try to set the guns order to 0 then go through every other entity and bump theres up 1 to make sure the gun is on top? |
| ||
Tried that and found out that I get the same problem with the other entities, i.e. the map in the first place. Buildings that are occluded by others now show through, making everything look like a Picasso painting ;) Must be a general problem with EntityOrder, I already double-checked everything... Come on guys, someone must have had this problem before!? |
| ||
As said in the docs : Setting an entity's order to non-0 also disables z-buffering for the entity, so should be only used for simple, convex entities like skyboxes, sprites etc. |
| ||
Could always render the player's gun to a separate, dedicated camera. That'd work. |
| ||
@Genexi2: Dammit, I must be blind! I overlooked that. @GfK: How would that look like? I've never done such a thing before... perhaps you could post a little sample code? Thx! :) |
| ||
Another trick is making the gun small yet close to the camera. It looks the same size and doesn't get stuck in walls (from your point of view). |
| ||
That's a neat trick BloodLocust, I did it that way and it works great. Btw, your FPS shell really helped me get started with my project... thanks! |
| ||
I had this problem with a clock dash, It liiked inside out, and i realised it was too near to the camera, try making tthe mesh really small and setting it near tio the camera and ensure your camera range near is outside the mesh |
| ||
Well, render your level first and hide the gun. Then make sure your not clearing the z buffer. Use "cameraclsmode" for this. Hide the level, then render the gun. |
| ||
@Ross Sorry, I'm a miserable newb... What do you mean by "render the gun/level"? Could you give me a short code sample so that I can understand it? |
| ||
HideEntity(Gun) ShowEntity(Level) Renderworld() ShowEntity(Gun) HideEntity(Level) Renderworld() flip() Something like that ... I think he meant. |
| ||
Hey, check this outGraphics3D 800,600 SetBuffer BackBuffer() Global camera = CreateCamera() CameraRange camera,0.1,1000 Global gun = CreateCylinder(8,True,camera) ; create a 8 seg cylinder, filled, and parented to the camera PositionEntity gun,1,-0.2,0 ScaleEntity gun,0.3,2,0.3 RotateEntity gun,90,0,0 Global light = CreateLight() Global world = CreatePivot() ; create a pivot called world ;just set up some cubes so there is something on screen. Parent these cubes to the world pivot, so ; you only need to hide the world pivot, to hide the level :o) Dim cube(40) For loop = 0 To 40 cube(loop) = CreateCube(world) ; parent all the objects in the level to the world pivot, for easy hiding EntityColor cube(loop) , Rand(100,255), Rand(100,255), Rand(100,255) PositionEntity cube(loop) , Rnd(-15,15), 0, Rnd(5,35) Next While Not KeyHit(1) If KeyDown(203) Then TurnEntity camera,0,1,0 If KeyDown(205) Then TurnEntity camera,0,-1,0 If KeyDown(200) Then MoveEntity camera,0,0,0.2 If KeyDown(208) Then MoveEntity camera,0,0,-0.2 If KeyHit(2) Then HideEntity world HideEntity gun ; hide the gun. You don't really NEED to hide the gun, as the next render will render over it, but no point in rendering it twice :) CameraClsMode camera,True,True ; set the camera cls mode so the last renderworld gets cleared UpdateWorld RenderWorld ; render the world ShowEntity gun ; show the gun and HideEntity world ; hide the world CameraClsMode camera,False,True ; set the camera cls mode so the last render to the backbuffer won't be cleared, only written on top of RenderWorld ; render the gun Flip ; flip the back buffer so it can be seen ShowEntity world ; show the world again for the next time Wend End Uses two renders. Firstly renders the world and hides the gun. Then shows the gun and hides the world. All the level objects are parented to the one pivot called "World", so to hide the world you just hide the pivot, and anything parented to the pivot will get hidden too. Hope that helps a little :o) |
| ||
Man, that's a really slick way of doing it! Plus your code didn't only solve my problem but also gave me an understanding of how rendering & z-buffering works. You should put this into the code archives or make a tutorial out of it, I think it might help a few other n00bs as well :) Many thanks! |