Downloads
Flow related downloads
Links to dependencies required to get Flow running, as well as useful third party tools for creating content. Also sample demos.
FLOW3D DEMO
Addon Module for Blitzmax. Download
FLOWED BETA
Flow3D’ss easy to use Object Placement Scene Editor. FlowED was made using Flow3D!
Mirrors:
code-kitty.com : Download!
BlitzMax
BlitzMax is a cross platform game programming language from Blitz Research. BlitzMax retains the BASIC roots of Blitz3D and BlitzPlus, but adds a ton of cool new features and abilities.
Enhanced BASIC language
BlitzMax is BASIC…but with a few twists, including:
- Function pointers
- Fully dynamic arrays
- Inheritance and polymorphism
- ‘By reference’ function parameters
- Byte, Short, Int, Long, Float and Double numeric data types
- Array and string slicing
- Flexible ‘collection’ system for dealing with linked lists etc
- Low level pointer handling
- UTF16 strings
- The ability to ‘Incbin’ binary data and access it as easily as if it were a regular file
- External language support for interfacing with C/C++/ObjectiveC or assembly code
A 30 day trial version of Blitzmax is avaliable from the Blitz Research site HERE
BLIDE
The best IDE for Blitzmax. The Flow team adopted BLIDE early on and makes full use of BLIDE’s intelliprompt and code completion functions making learning Flow and getting upto speed with Blitzmax so much easier. Although BLIDE is free we highly recommend the Plus version which includes many helpfull extra features. Download BLIDE HERE.
CEGUI relates Tools and Utilities
The Crazy Eddie User Interface library integrated in flow includes a selection of tools to make the UI designers life easier.
- CEGUI Layout Editor
- CEGUI Imageset Editor
Avaliable from the main CEGUI site HERE
Ogre Bitmap Font Maker
A tool for creating bitmap font resources for Ogre Avaliable from HERE
Ogre .Mesh exporters
Early Flow Compatibility Demo

Click on the Code Bar below to see Blitzmax Code. Download Demo
'Header Import flow.main '/Header 'Initializing Ogre AppTitle = "Flow [Escape to exit - C to toggle Shadows, R for offset normal ground in D3D only]" fG.init(True) HideMouse() EnablePolledInput() 'Setting the Scene 'Main scene light positioned to the right- Global Light:TLight = fG._light Light.Setposition(- 40, 600, - 20) Light.setDiffuseColour(1, 1, 1) Light.setSpecularColour(.5, .5, .5) 'Turn on shadows- fG._scene.setShadowTechnique(SHADOWTYPE_STENCIL_MODULATIVE) 'Load the Robot OSM- fG.LoadOSM("walkie.OSM") 'Grab the robot legs entity and node- Global robot:TEntity = fG._scene.getEntity("Walkie") Global robotnode:Tscenenode = robot.getParentSceneNode() 'Grab the robot head assembly ( head, weapons, mounts ) node- Global robotHeadAssembly:tscenenode = fG._scene.getentity("Box03").getParentSceneNode() 'Get the robot's spine for attaching the head assembly to- Global spine:TBone = robot.getSkeleton().getBoneWithName("MechPelvis") 'Get the robot leg's animations, enable standing by default- Global animWalk:TAnimationState = Robot.getAnimationState("Walk") Global animStrafe:TAnimationState = Robot.getAnimationState("Strafe") Global animStand:TAnimationState = Robot.getAnimationState("Idle") animStand.setEnabled(True) 'Main Camera Setup Global cameraNode:TSceneNode = RobotNode.createChildSceneNode("cameraNode", 0, 0, 0) cameraNode.setInheritOrientation(False) fG._camera.setPosition(0, 15, - 30) cameraNode.attachObject(fG._camera) 'Set up the floor Global Floor:TEntity = fG._scene.createEntity("floor", "Plane01.mesh") Global floornode:TSceneNode = fG._rootnode.createChildSceneNode("floornode", 0, 0, 0) floornode.attachObject(Floor) Floor.setMaterialName("Rocks") '/Setting the Scene 'Variables used for mouselook- Global yaw:Float = 0 Global mousepos_x:Int = fg._ogre.GETwidth() / 2 Global mousepos_y:Int = fg._ogre.GETheight() / 2 Global currMouse_x:Int = fg._ogre.GETwidth() / 2 Global currMouse_y:Int = fg._ogre.GETheight() / 2 Global mouserel_x:Int Global mouserel_y:Int Global rotyaw:Float = 0 Global rotpitch:Float = 0 cameraNode.rotate(TVector3.Create(0, 1, 0), 180) Global shadows:Int = True Global showRocks:Byte = True 'Ad these are for you! Global animSpeed:Float =.03 Global strafeSpeed:Float =.5 Global walkSpeed:Float = 1 Repeat fG._camera.lookAt(robotnode.getPosition().getX() , robotnode.getPosition().getY() , robotnode.getPosition().getZ()) 'Increase the animation timer each frame- 'animState1.addTime(.005) 'Capture relative mouse coords- currMouse_x = MouseX() currMouse_y = MouseY() mouserel_x = currMouse_x - mousepos_x mouserel_y = currMouse_y - mousepos_y MoveMouse(mousepos_x, mousepos_y) 'Transform the camera based on these coords and keyboard activity- cameraNode.yaw(rotyaw + (mouserel_x * 3 *.025) , TS_LOCAL) 'cameraNode.pitch(rotpitch + (mouserel_y * 3 * -.025) , TS_LOCAL) 'Instead of actual movement, set up animations- 'Check input to determine the states of the robot- animStand.setEnabled(False) animStrafe.setEnabled(False) animWalk.setenabled(False) 'The following variables contain movement details: Local Strafe:Int = KeyDown(KEY_D) - KeyDown(KEY_A) Local Walk:Int = KeyDown(KEY_W) - KeyDown(KEY_S) 'Actually move the mesh: robotnode.translate(Strafe * strafeSpeed, 0, Walk * -walkSpeed, TS_LOCAL) 'Set the head assembly node's position to that of the spine bone. Get spine bone by transforming spine's local position 'From it's parent bone by the leg entity's world transform. robotHeadAssembly.setPositionWithVector3(robot._getParentNodeFullTransform().mulWithVector3(spine._getDerivedPosition())) 'Lets reset animation type to keep animations synced together. If KeyHit(KEY_D) Or KeyHit(KEY_A) Or .. KeyHit(KEY_W) Or KeyHit(KEY_S) Then animStrafe.setTimePosition(0) ;animWalk.setTimePosition(0) If (Strafe Or Walk) Then If Strafe Then animStrafe.setenabled(True) animStrafe.addTime(animSpeed * strafe) End If If Walk Then animWalk.setenabled(True) animWalk.addTime(animSpeed * walk) End If Else animWalk.setEnabled(False) animStrafe.setEnabled(False) animStand.setenabled(True) animStand.addTime(animSpeed *.1) EndIf 'If user hits "R" then toggle between offset materials and standard ( Direct3D Only! ) If KeyHit(KEY_R) If showRocks = True Then showRocks = False Floor.setMaterialName("OffsetMappingSample") Else showRocks = True Floor.setMaterialName("Rocks") EndIf EndIf 'If user hits "C" then toggle shadows If KeyHit(KEY_C) Then shadows = 1 - shadows;fG._viewport.setShadowsEnabled(shadows) 'Render one frame every 60 seconds- fG.renderWorld() Delay 1000 / 60 Until KeyHit(KEY_ESCAPE) Or AppTerminate() |
This was a simple compatibility test demo we released several months ago. Not designed to wow but does test basic rendering, fixed function, stencil shadows and PS 2.0 shaders. The code isn’t supposed to impress and could have been far shorter if the entire scene including camera, lights etc were included in the scene that contains the robot.
I think it does give you an idea of how to load geometry and set up a basic scene in Flow. Most people would probably want to create the scene in Flowed making most of the source here redundant.

