Skip to content

Levels: Mapper's corner

poVoq edited this page Jun 21, 2013 · 33 revisions

Welcome to the mapper's corner. Here you can learn about creating levels for qfusion. So far this page is only a collection of various details relatively specific to qfusion mapping, mostly based on information from the Warsow wiki or forums. Feel free to expand or correct this page, and specific tutorials are highly welcome!


1. Basic setup

As qfusion is an game engine only, it does not include any textures or other media files required for mapping. It is therefore recommended to map for Warsow for the time being. The recommended level editor for Warsow is NetRadiant a stabilized fork of GTKRadiant. It has the advantage that it is easy to install and includes support for Warsow. However likely you can use other versions of the Radiant family of editors also. Additionally you can also use the Quark editor with also supports Warsow out of the box. A much more recent addition to the BSP level editing toolbox is Trenchbroom which you will likely find a superior editing experience, but it does not support Warsow and many of the advanced features of qfusion (yet). It should be possible to make the geometry in Trenchbroom and convert it with Netradiant though (warning, untested!).

1.2. General editing

Basically level editing for qfusion is very similar as mapping for any Quake3 engine derived game (for example Wolfenstein: Enemy Territory or Jedi Knight Academy). Any feature you find in an vanilla Quake3 tutorial should work almost exactly the same, and most other addons found in later iterations of the Q3 engine should work at least quite similar. As there is an abundance of tutorials and mapping tips for these games available online, this wiki only concentrates on the unusual features of qfusion you are likely to use at some point.

2. Level compiling compiling with q3map2

q3map2 is the official level and lightmap compiler for idTech3 engines. It should have been included with your Netradiant copy and supports Warsow (and qfusion) natively. As it is a quite complex and advanced light rendering program, there is a full wiki-book dedicated to its features. However for now stick to the Netradiant included standard presets for Warsow.

2.1. Special FBSP qfusion format

FBSP is an improvement on the regular q3 bsp level format, specifically developed for qfusion. It is supported by q3map2 and can be activated with the switch:

-game qfusion

It adds higher quality light-maps and light-styles

2.1.1. Using light-styles

Light-styles are a set of different styles on how light entities can behave, allowing them to pulse, flick, etc. Setting up a light with a light-style is as simple as creating a new field inside any light entity called "style", and feed with a number between 1 and 11 (0 is standard lighting).

These are the actual effect names for them:

1. FLICKER (first variety)
2. SLOW STRONG PULSE
3. CANDLE (first variety)
4. FAST STROBE
5. GENTLE PULSE 1
6. FLICKER (second variety)
7. CANDLE (second variety)
8. CANDLE (third variety)
9. SLOW STROBE (fourth variety)
10. FLUORESCENT FLICKER
11. SLOW PULSE NOT FADE TO BLACK

3. Shaders

3.1. Quake3 style shaders

Theses are the classic shaders found in Quake3 that define how a textures looks in the game. The should not be confused with the much more recent GPU based fragment and vertext shaders, even though qfusion has recently included a way to render these directly on the GPU also (which gives a nice speed boost). The original q3map3 shader manual can be found here.

3.1.1. qfusion Q3 style shader manual

Link to the full qfusion q3 style shader manual

3.2. GPU fragment and vertex shaders

The preferred high level GPU shader language in qfusion is GLSL, specifically the OpenGL 2.0 ES subset. qfusion allows for loading these directly from your hard-drive (instead of embedding them in the engine code) which should allow for relative easy editing in theory. As this is a brand new feature there are no additional details available at the time of writing this Please add any information you might have on working with GLSL shaders in qfusion

4. Terrain

Terrain meshes with vertex-color based texture blending and instanced foliage cover is supported. No advanced terrain lods or GPU rendered terrain so far though. Futher details need to be filled

5. Map models

VBO and instancing is supported by qfusion. Further details need to be filled

6. Special FX

6.1. Dynamic sky portals

Needs to be filled

6.2. Sun entity

Needs to be filled

6.3. Envshots and cube maps

Needs to be filled

6.4. Distortion and per pixel lit materials

missing info

6.5. Moving and rotating mirror\portal surfaces

qfusion has support for moving and rotating mirror\portal surfaces. However, there are some restrictions on this feature because of the horrible way mirrors\portals work in Quake3 compatibility had to be ensured.

  • If your mirror\portal rotates around an axis without moving no restrictions are made on the location of misc_surface_portal entity (however, it should be not further than 64 units at the start).
  • Moving portals are not quite working correctly, they act more like mirrors,projecting the portal view on the surface without adjusting it's bias to match the current origin.

7. Bot navigation

Needs to be filled

8. Map scripting

There is a "hacky" implementation of map scripts. AngelScripts are loaded from "progs/maps/mapname.mp" project files, containing the list of includes (GT scripts are loaded in the same way). Each map can implement spawn functions for custom entities and 4 hooks with hardcoded names:

  • void MAP_Init() for map initialization
  • void Map_Exit() for map shutdown
  • void Map_PreThink() - function which will be called before any world entity has had its think function called and physics run for this frame
  • void Map_PosTthink() - function which will be called after all world entities have had their think functions called and physics run for this frame

Note that the implementation is somewhat hacky due to angelwrap API limitations and may not work correctly in 100% cases.

Clone this wiki locally