Rekindled Phoenix Posted June 7, 2011 Share Posted June 7, 2011 How would I go about 'unproject'ing a particular type of object (let's say AI_Node), and draw a line between all of the same types of objects? for a demonstration I need to show a nav-mesh, written in Lua, viewed within the Sandbox editor. Is it possible to only execute certain lua functions when viewed within the sandbox editor? As an alternate solution, checking whether in debug mode might work. Quote Link to comment Share on other sites More sharing options...
Rick Posted June 7, 2011 Share Posted June 7, 2011 You should be able to do your line drawing after you hook your script to the drawing hook and using http://www.leadwerks.com/wiki/index.php?title=Cameras#CameraUnproject to project lines. Here is the main game loop I used since I controlled everything from entity scripts and not the main game loop. You set a global variable and check against that variable inside your scripts. Note that I also allow each script to have an Initialize method which only gets called once when entering game mode. This allowed my scripts to init some values that only needed to be initialized when entering game mode instead of design mode. require("Scripts/constants/collision_const") require("Scripts/constants/engine_const") require("Scripts/LinkedList") require("Scripts/filesystem") require("Scripts/math/math") if fw==nil then --we are not in Editor RegisterAbstractPath("") Graphics(800,600) -- need a better way to get screen res fw=CreateFramework() scene=LoadScene("") -- need a way to get a scene to load scene:SetCollisionType(COLLISION_SCENE) TFilter(1) AFilter(4) end -- set globals SetGlobalString("mode", "GAME_MODE") SetGlobalString("quit", "false") FlushKeys() FlushMouse() for k,v in pairs(objecttable) do if v.Initialize ~= nil then v:Initialize() end end --main function while (KeyHit(KEY_ESCAPE) == 0) and (GetGlobalString("quit") == "false") do fw:Update() fw:Render() Flip(0) end -- reset values SetGlobalString("mode", "DESIGN_MODE") SetGlobalString("quit", "false") Quote Link to comment Share on other sites More sharing options...
Rekindled Phoenix Posted June 7, 2011 Author Share Posted June 7, 2011 Thanks Rick for the awesome code sample. I guess my question was more related to individual item scripts interacting on their own. Can you help? I still can't get it to work... require("scripts/class") local class=CreateClass(...) function class:InitDialog(propertygrid) self.super:InitDialog(propertygrid) local group=propertygrid:AddGroup("Pathing") group:AddProperty("Avoidance Radius",PROPERTY_STRING) end function class:CreateObject(model) local object=self.super:CreateObject(model) function object:Update() -- self.model:Turn(Vec3(0,1,0)) -- Used to verify script is valid local cpos = EntityPosition(self.model) local Pos = CameraUnproject(fw.main.camera, cpos) DrawText("I'm located here!", Pos.x, Pos.x) end end I know I'm somewhat close to the solution, but I keep getting exceptions which crash the Sandbox. I'm still getting used to the Lua syntax... Quote Link to comment Share on other sites More sharing options...
Rick Posted June 7, 2011 Share Posted June 7, 2011 Your above code doesn't crash my editor but it doesn't draw the text either. Try this as a quick and dirty way to draw text. Note that when hooking into the "Flip" hook it's a global function and not specifically a script function, so not sure what happens when you put more than one of these on screen if the DrawMe() just gets added to the hook and called multiple times or if it overwrites the "Flip" hook and so calling it within an entity script is kind of pointless. What I'm doing with my test GUI is having a controller script which is an invisible model. The idea is to only put one instance of this controller script in your scene and it'll do this "Flip" hook and it'll loop through all objects like I am below and look for specific properties of the things I care about. In my GUI example I have a GuiDraw script that is looking for entities that have a property called type which is set to "gui.control" and then it knows to call the Draw function of that control which is a function I define as part of the object, it's not an LE specific function. You could do the same with your pathfinding scripts. Having a master script which there is only meant to be 1 placed in the scene can act as the central controller for other scripts as long as the master script has a way to find the other scripts. require("scripts/class") require("scripts/hooks") local class=CreateClass(...) function class:InitDialog(propertygrid) self.super:InitDialog(propertygrid) local group=propertygrid:AddGroup("Pathing") group:AddProperty("Avoidance Radius",PROPERTY_STRING) end function DrawMe() for k,v in pairs(objecttable) do if v.type ~= nil then if v.type == "test" then local cpos = EntityPosition(v.model) local Pos = CameraUnproject(fw.main.camera, cpos) DrawText("I'm located here!", Pos.x, Pos.y) end end end end function class:CreateObject(model) local object=self.super:CreateObject(model) object.model = model object.type = "test" AddHook("Flip", DrawMe) function object:Update() self.model:Turn(Vec3(0,1,0)) -- Used to verify script is valid end end Quote Link to comment Share on other sites More sharing options...
Rekindled Phoenix Posted June 8, 2011 Author Share Posted June 8, 2011 This is exactly what I was looking for! I will probably modify your script to scan through all entities, checking for "NavMesh " types. This will give me a collection of entities to attach the DrawLine() method too. Checking 'fw' will allow me to only execute the script within the Sandbox for demonstration. Thank you Rick! Quote Link to comment Share on other sites More sharing options...
Rick Posted June 8, 2011 Share Posted June 8, 2011 No problem. I want pathfinding to so if I can help someone making pathfinding in the editor I'm happy to help Quote Link to comment Share on other sites More sharing options...
Rekindled Phoenix Posted June 8, 2011 Author Share Posted June 8, 2011 I'm currently working on a pathfinding module that I can attach to any NPC within C#. Once that is completed, I'm going to try to port as much as possible to Lua for others to use. Users will be able to choose different types of pathfinding defined in the dropdown that will be available within the Editor property menu. I'm taking the method applied in this blog post, and adapting it to the standard Leadwerks AI_Node objects for others to use. Using a combination of avoidance objects to define the blacklist where not to walk, and (completely optional) NavMesh nodes to use for guidance, will create a flexible and easy to use pathing system. Quote Link to comment Share on other sites More sharing options...
Rekindled Phoenix Posted June 9, 2011 Author Share Posted June 9, 2011 I'm coming across an odd issue related to drawing labels on objects using the recently posted script. As shown in the screenshot, if I am facing the opposite direction, by moving the camera forward a couple of units, and the unproject function is printing the label as if the rock was on the other side of the map. Do you know what's going on?? Quote Link to comment Share on other sites More sharing options...
Rick Posted June 9, 2011 Share Posted June 9, 2011 Interesting. I guess one way to get around this is to see if the model is visible or not (EntityVisible) to the fw.main.camera and if it's not skip drawing the name. That could cause other issues if you have smaller objects behind bigger objects but not sure if that would matter to you or not. I don't remember ever running into that issue. Quote Link to comment Share on other sites More sharing options...
Pixel Perfect Posted June 9, 2011 Share Posted June 9, 2011 I'm coming across an odd issue related to drawing labels on objects using the recently posted script. As shown in the screenshot, if I am facing the opposite direction, by moving the camera forward a couple of units, and the unproject function is printing the label as if the rock was on the other side of the map. Do you know what's going on?? I found when using CameraUnproject that if the returned z value was less than 0, that is the object is behind you, then I needed to inhibit the display of the label or it would display in odd places. Quote Intel Core i5 2.66 GHz, Asus P7P55D, 8Gb DDR3 RAM, GTX460 1Gb DDR5, Windows 7 (x64), LE Editor, GMax, 3DWS, UU3D Pro, Texture Maker Pro, Shader Map Pro. Development language: C/C++ Link to comment Share on other sites More sharing options...
Rekindled Phoenix Posted June 12, 2011 Author Share Posted June 12, 2011 Thank you for the help. Hopefully I'll have something asset-worthy soon for pathfinding Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.