From 97fe823fc1056dd6490921ce339d6ef3cfc95610 Mon Sep 17 00:00:00 2001 From: Garux Date: Sun, 3 May 2020 12:05:38 +0300 Subject: [PATCH] docs: add original shaderManual --- docs/shaderManual/alpha-channels.html | 101 ++++ docs/shaderManual/alphachannel01.jpg | Bin 0 -> 26981 bytes docs/shaderManual/antiportal_sm.jpg | Bin 0 -> 74639 bytes docs/shaderManual/cel-shading.html | 98 ++++ docs/shaderManual/clampmap.jpg | Bin 0 -> 5529 bytes docs/shaderManual/contents.html | 276 +++++++++++ docs/shaderManual/decal-tricks.html | 133 +++++ docs/shaderManual/decal.jpg | Bin 0 -> 29694 bytes docs/shaderManual/decal_geisha.jpg | Bin 0 -> 23241 bytes docs/shaderManual/default.css | 202 ++++++++ docs/shaderManual/foghull.html | 108 +++++ docs/shaderManual/fur.html | 110 +++++ docs/shaderManual/fur.jpg | Bin 0 -> 16494 bytes docs/shaderManual/general-directives.html | 199 ++++++++ docs/shaderManual/index.html | 98 ++++ docs/shaderManual/light-emitting-shaders.html | 254 ++++++++++ docs/shaderManual/lightstyles.html | 131 +++++ docs/shaderManual/lightstyles.jpg | Bin 0 -> 28929 bytes docs/shaderManual/nav.png | Bin 0 -> 1032 bytes docs/shaderManual/navlow.png | Bin 0 -> 1049 bytes docs/shaderManual/navtop.png | Bin 0 -> 1051 bytes docs/shaderManual/preface.html | 103 ++++ .../shaderManual/q3map-global-directives.html | 441 +++++++++++++++++ .../q3map-surface-parameter-directives.html | 198 ++++++++ docs/shaderManual/q3map2.gif | Bin 0 -> 318 bytes docs/shaderManual/qer_alphafunc.jpg | Bin 0 -> 54645 bytes docs/shaderManual/ql_32.png | Bin 0 -> 2383 bytes .../quake-editor-radiant-directives.html | 104 ++++ docs/shaderManual/shader-concepts.html | 190 ++++++++ docs/shaderManual/sky01.jpg | Bin 0 -> 18352 bytes docs/shaderManual/sky02.jpg | Bin 0 -> 16242 bytes docs/shaderManual/sky03.jpg | Bin 0 -> 16147 bytes docs/shaderManual/sky04.jpg | Bin 0 -> 16383 bytes docs/shaderManual/sky05.jpg | Bin 0 -> 23805 bytes docs/shaderManual/stage-directives.html | 454 ++++++++++++++++++ .../terrain-and-alphamod-blends.html | 122 +++++ docs/shaderManual/texture-creation.html | 109 +++++ docs/shaderManual/title.gif | Bin 0 -> 2526 bytes docs/shaderManual/titleImage.jpg | Bin 0 -> 25182 bytes .../triggerable-shader-entities.html | 78 +++ 40 files changed, 3509 insertions(+) create mode 100644 docs/shaderManual/alpha-channels.html create mode 100644 docs/shaderManual/alphachannel01.jpg create mode 100644 docs/shaderManual/antiportal_sm.jpg create mode 100644 docs/shaderManual/cel-shading.html create mode 100644 docs/shaderManual/clampmap.jpg create mode 100644 docs/shaderManual/contents.html create mode 100644 docs/shaderManual/decal-tricks.html create mode 100644 docs/shaderManual/decal.jpg create mode 100644 docs/shaderManual/decal_geisha.jpg create mode 100644 docs/shaderManual/default.css create mode 100644 docs/shaderManual/foghull.html create mode 100644 docs/shaderManual/fur.html create mode 100644 docs/shaderManual/fur.jpg create mode 100644 docs/shaderManual/general-directives.html create mode 100644 docs/shaderManual/index.html create mode 100644 docs/shaderManual/light-emitting-shaders.html create mode 100644 docs/shaderManual/lightstyles.html create mode 100644 docs/shaderManual/lightstyles.jpg create mode 100644 docs/shaderManual/nav.png create mode 100644 docs/shaderManual/navlow.png create mode 100644 docs/shaderManual/navtop.png create mode 100644 docs/shaderManual/preface.html create mode 100644 docs/shaderManual/q3map-global-directives.html create mode 100644 docs/shaderManual/q3map-surface-parameter-directives.html create mode 100644 docs/shaderManual/q3map2.gif create mode 100644 docs/shaderManual/qer_alphafunc.jpg create mode 100644 docs/shaderManual/ql_32.png create mode 100644 docs/shaderManual/quake-editor-radiant-directives.html create mode 100644 docs/shaderManual/shader-concepts.html create mode 100644 docs/shaderManual/sky01.jpg create mode 100644 docs/shaderManual/sky02.jpg create mode 100644 docs/shaderManual/sky03.jpg create mode 100644 docs/shaderManual/sky04.jpg create mode 100644 docs/shaderManual/sky05.jpg create mode 100644 docs/shaderManual/stage-directives.html create mode 100644 docs/shaderManual/terrain-and-alphamod-blends.html create mode 100644 docs/shaderManual/texture-creation.html create mode 100644 docs/shaderManual/title.gif create mode 100644 docs/shaderManual/titleImage.jpg create mode 100644 docs/shaderManual/triggerable-shader-entities.html diff --git a/docs/shaderManual/alpha-channels.html b/docs/shaderManual/alpha-channels.html new file mode 100644 index 00000000..466ae115 --- /dev/null +++ b/docs/shaderManual/alpha-channels.html @@ -0,0 +1,101 @@ + + + + + + Q3Map2 Shader Manual + + + + + + + + + + +

Alpha Channels

+ +

To use some blend modes of alphaFunc, you must add an alpha channel to your texture files. Photoshop can do this. Paintshop Pro has the ability to make an alpha channel but cannot work directly in to it. In Photoshop you want to set the type to Mask. Black has a value of 255. White has a value of 0. The darkness of a pixel's alpha value determines the transparency of the corresponding RGB value in the game world. Darker = more transparent.

+ +

Care must be taken when reworking textures with alpha channels. Textures without alpha channels are saved as 24 bit images while textures with alpha channels are saved as 32 bit. If you save them out as 24 bit, the alpha channel is erased. Note: Adobe Photoshop will prompt you to save as 32, 24 or 16 bit. Choose wisely. If you save a texture as 32 bit and you don't actually have anything in the alpha channel, Quake III Arena may still be forced to use a lower quality texture format (when in 16 bit rendering) than if you had saved it as 24 bit.

+ +

To create a texture that has "open" areas, make those areas black in the alpha channel and make white the areas that are to be opaque. Using gray shades can create varying degrees of opacity/transparency.

+ +
+// Opaque texture with see-through holes knocked in in.
+textures/base_floor/pjgrate1
+{
+    surfaceparm metalsteps
+    cull none
+
+    // A GRATE OR GRILL THAT CAN BE SEEN FROM BOTH SIDES
+    {
+        map textures/base_floor/pjgrate1.tga
+        blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+        alphaFunc GT0
+        depthWrite
+        rgbGen identity
+    }
+    {
+        map $lightmap
+        rgbGen identity
+        blendFunc GL_DST_COLOR GL_ZERO
+        depthFunc equal
+    }
+}
+
+ +

The alpha channel can also be used to merge a texture (including one that contains black) into another image so that the merged art appears to be and opaque decal on a solid surface (unaffected by the surface it appears to sit on), without actually using an alpha function. The following is a very simple example:

+ + + +

Start with a TGA file image. In this case, a pentagram on a plain white field (figure 1A). The color of the field surrrounding the image to be merged is not relevant to this process (although having a hard-edged break between the image to be isolated and the field makes the mask making process easier). Make an alpha channel. The area of the image to be merged with another image is masked off in white. The area to be masked out (notused) is pure black (figure 1B). The image to be merged into is greenfloor.tga (figure 1C).

+ +

Make a qer_editorimage of greenfloor.tga. This is placed in the frame buffer as the map image for the texture. By using GL_SRC_ALPHA as the source part of the blend equation, the shader adds in only the non-black parts of the pentagram. Using GL_MINUS_ONE_SRC_ALPHA, the shader inverts the pentagram's alpha channel and adds in only the non-black parts of the green floor.

+ +

In a like manner, the alpha channel can be used to blend the textures more evenly. A simple experiment involves using a linear gradiant in the alpha channel (white to black) and merging two textures so they appear to cross fade into each other.

+ +

A more complicated experiment would be to take the pentagram in the first example and give it an aliased edge so that the pentagram appeared to fade or blend into the floor.

+ + + \ No newline at end of file diff --git a/docs/shaderManual/alphachannel01.jpg b/docs/shaderManual/alphachannel01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9cc0ffc7d070348330ed1362946a82c50790b7ec GIT binary patch literal 26981 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ŷ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 literal 0 HcmV?d00001 diff --git a/docs/shaderManual/antiportal_sm.jpg b/docs/shaderManual/antiportal_sm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..80826acec9478f92a274b8cb87755581048e6550 GIT binary patch literal 74639 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 + + + + + Q3Map2 Shader Manual + + + + + + + + + +

Cel Shading

+ +

Cel shading is the technique used to make your maps render like cartoons, with black (or other color) solid outlines tracing hard edges.

+ +In order for celshading to work properly, you must use -meta when compiling the BSP. +The funny little nonplanar/shadeangle/invert/offset nonsense in cel.shader is what makes it work properly. +You'll know when it's working when it starts taking about 10-20x as long to make the BSP. + +
+// ink shader for maps
+// to use, add "cel" to shaderlist.txt
+// add a "_celshader" key to worldspawn entity with a value of "cel/ink"
+
+textures/cel/ink
+{
+    qer_editorimage gfx/colors/black.tga
+
+    q3map_notjunc
+    q3map_nonplanar
+    q3map_bounce 0.0
+    q3map_shadeangle 120
+    q3map_texturesize 1 1
+    q3map_invert                //inverts drawing surface for backfacing hull
+    q3map_offset -2.0           //offsets surface by the specified distance
+
+    surfaceparm nolightmap
+    surfaceparm trans
+    surfaceparm nonsolid
+    surfaceparm nomarks
+
+    sort 16
+
+    {
+        map gfx/colors/black.tga
+        rgbGen identity
+    }
+}
+
+ + + + + + \ No newline at end of file diff --git a/docs/shaderManual/clampmap.jpg b/docs/shaderManual/clampmap.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2984da5f2b50cfbc6e95eb80fa6104091c2082c7 GIT binary patch literal 5529 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 literal 0 HcmV?d00001 diff --git a/docs/shaderManual/contents.html b/docs/shaderManual/contents.html new file mode 100644 index 00000000..ac9635b0 --- /dev/null +++ b/docs/shaderManual/contents.html @@ -0,0 +1,276 @@ + + + + + + Q3Map2 Shader Manual + + + + + + + + + +

Contents

+ + + + + \ No newline at end of file diff --git a/docs/shaderManual/decal-tricks.html b/docs/shaderManual/decal-tricks.html new file mode 100644 index 00000000..e17a70c0 --- /dev/null +++ b/docs/shaderManual/decal-tricks.html @@ -0,0 +1,133 @@ + + + + + + Q3Map2 Shader Manual + + + + + + + + + + +
+ +

Multiplicative Decals

+ +

Instead of doing blended or additive decals, sometimes the best effect is actually a multiply:

+ +
+blendFunc GL_DST_COLOR GL_ZERO
+
+ +

The source texture is white with yellow/blue (or whatever) arrow on it. Combined with polygonOffset and perhaps a sort key, this can be a great way to get a decal effect that works okay with bullet marks and player shadows.

+ +

Inverse Multiplicative Shadows

+ +

While the above trick works well 95% of the time, sometimes you need to use fog. In order for a multiplicative decal to face out properly in fog, it has to be inverted, and using an inverse blendFunc:

+ +
+blendFunc GL_ZERO GL_ONE_MINUS_SRC_COLOR
+
+ +

The source image will be negative of the above image, (white = black, blue = yellow, etc). This is the trick that the player shadow mark shader use.

+ +Original and inverted texture + +
+textures/obsidian-blastburn_decals/p-geisha
+{
+	noPicMip
+	//draws polygons of this shader just above coplanar surface
+	polygonOffset
+	//prevents bounce from affecting this shader
+	q3map_bounceScale 0
+	surfaceparm detail
+	surfaceparm nomarks
+	surfaceparm nonsolid
+	{
+		map textures/obsidian-blastburn_decals/p-geisha.tga
+		//inverse multiplicative blend (TGA channels inverted)
+		blendFunc GL_ZERO GL_ONE_MINUS_SRC_COLOR
+	}
+}
+
+ +

Using _decal Entities

+ +

Sometimes laying out perfect patch meshes aligned with geometry is too much of a pain in the ass. Enter _decal entities. Add the following to your entities.def (Enemy Territory mappers should already have it):

+ +
+/*QUAKED _decal (0 1.0 0) ?
+-------- KEYS --------
+"target" : the name of the entity targetted at for projection
+-------- SPAWNFLAGS --------
+(none)
+-------- NOTES --------
+Compiler-only entity that specifies a decal to be projected. Should contain 1 or more patch meshes (curves) and target an info_null entity. The distance between the center of the _decal entity and the target is the axis and distance of projection.
+*/
+
+ +

Make a simple patch mesh (it can be bent, but the quads in Radiant must be rectangular), select it and use the right-click context menu to turn it into a _decal entity. Target an info_null below the _decal entity and compile. Everything between the decal patch and the info_null will have a decal projected onto it.

+ +_decal Entity + +

Make sure you compile with a recent (post-2.5) version of Q3Map2 with _decal support.

+ +

It will project onto terrain, brushes, models, patches, whatever. To suppress decals on particular shaders, use surfaceparm nomarks.

+ +

Happy decaling!

+ +

-ydnar

+ +
+ + + \ No newline at end of file diff --git a/docs/shaderManual/decal.jpg b/docs/shaderManual/decal.jpg new file mode 100644 index 0000000000000000000000000000000000000000..405847f6c329f9e29acc5d4b16a7faf1af6cf5bc GIT binary patch literal 29694 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 literal 0 HcmV?d00001 diff --git a/docs/shaderManual/decal_geisha.jpg b/docs/shaderManual/decal_geisha.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9750da15134ba199c0db1cba4f1d0a196ef6b514 GIT binary patch literal 23241 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 ONjyMkGMC}c%zpuyQo~yS literal 0 HcmV?d00001 diff --git a/docs/shaderManual/default.css b/docs/shaderManual/default.css new file mode 100644 index 00000000..5659b623 --- /dev/null +++ b/docs/shaderManual/default.css @@ -0,0 +1,202 @@ +* { margin: 0; padding: 0; } + +.hide { display: none; } +.invisible { visibility: hidden; } + +.center { + display: block; + clear: both; + margin: 1em auto 1em auto; +} + +.right { + float: right; + padding-left: 32px; +} + +.left { + float: left; + padding-right: 32px; +} + +.clear { + clear: both; +} + +html { background-color: #eee; } + +body { + font: 0.9em/1.5em Verdana, Lucida, Lucida Sans, Helvetica, Ariel, Sans-serif; + background-color: white; + width: 768px; + margin: 0 auto 0 auto; + padding: 1em 32px 4em 32px; +} + +h1, h2, h3, h4, h5, h6 { + margin: 1em 0 1em 0; +} + +h2 { + line-height: 32px; + text-indent: 38px; + background: transparent url("ql_32.png"/*tpa=http://robotrenegade.com/q3map2/docs/shader_manual/_images/ql_32.png*/) no-repeat; +} + +*+h2 { + margin-top: 2em; +} + +p { margin-bottom: 1em; } + +blockquote +{ + margin: 1em 32px 1em 32px; + padding: 0 1em 0 1em; + font-size: 0.9em; + line-height: normal; + color: #444; + background-color: #ffe; + border: 1px #ccc solid; + text-align: justify; +} + +blockquote h4 { margin-top: 0.5em; } + +pre { + margin: 1em 0 1em 0; + padding: 0.5em 1em 0.5em 1em; + max-height: 25.2em; + overflow: auto; + background-color: #eee; + border: 1px solid #ccc; + font-size: 0.9em; + line-height: normal; +} + +a { text-decoration: none; color: #29387b; background-color: transparent; } +a:hover { text-decoration: underline; color: #349; background-color: transparent; } +a img { border: 0; } + +ul+p { margin-top: 1em; } + +li { margin-left: 2em; } + +#contents li { list-style: none; } + +dl { + margin-bottom: 1em; + line-height: normal; +} + +dt { + font-weight: bold; + margin-top: 0.5em; +} + +dd { + border-left: 2px solid #000; + margin: 0 0 0 4em; + padding-left: 0.5em; +} + + + + +#nav { + z-index: 100; + position: fixed; + display: block; + width: 32px; + height: 32px; + top: 16px; + right: 0; + font-size: 8pt; +} + +#navtop { + position: relative; + height: 8px; + width: 256px; + background: url("navtop.png"/*tpa=http://robotrenegade.com/q3map2/docs/shader_manual/_images/navtop.png*/) no-repeat; +} + +#navlow { + position: relative; + top: 0; + height: 8px; + width: 256px; + background: url("navlow.png"/*tpa=http://robotrenegade.com/q3map2/docs/shader_manual/_images/navlow.png*/) no-repeat; +} + +#navbutton { + display: block; + height: 32px; + width: 32px; + margin: 0; + padding: 0; + list-style: none; + background: url("nav.png"/*tpa=http://robotrenegade.com/q3map2/docs/shader_manual/_images/nav.png*/) no-repeat; +} + +#navbutton ul { + display: block; + position: fixed; + width: 256px; + top: 16px; + right: 0; + display: none; +} + +/* Major */ +#navbutton ul li { + position: relative; + margin: 0; + padding: 0 0 1em 16px; + list-style: none; + line-height: 1.6em; + font-weight: bold; + border-left: 1px solid #ccc; + background-color: #fff; +} + +/* Minor */ +#navbutton ul li ul { + position: relative; + top: 0; +} + +#navbutton ul li ul li { + position: relative; + padding: 0 0 0 2em; + font-weight: normal; + font-size: 7pt; + border: none; +} + + + +#navbutton:hover ul { display: block; } + + + + + + +/* Index */ +#index { width: 600px; margin: 0 auto 0 auto; background-color: #eee; } + +#v-space { width: 600px; position: absolute; top: 15%; } + +#q3map2sm { height: 54px; border: 1px #ccc solid; background: white url("title.gif"/*tpa=http://robotrenegade.com/q3map2/docs/shader_manual/_images/title.gif*/) no-repeat 50%; } + +#screenie { height: 255px; margin: 0; padding: 0; background: transparent url("titleImage.jpg"/*tpa=http://robotrenegade.com/q3map2/docs/shader_manual/_images/titleImage.jpg*/) no-repeat; } +#screenie a { display: block; width: 600px; height: 255px; margin: 0; text-indent: -1000em; } + +#footer { color: #999; clear: both; font: 8pt/1.5em verdana,arial,sans-serif; } +#footer a, #footer a:link, #footer a:visited { color: #999; } +#footer a:hover, #footer a:active { color: gray; } +#footer #left { float: left; } +#footer #right { float: right; } + +#q3map2logo { position: absolute; right: 8px; bottom: 8px; } \ No newline at end of file diff --git a/docs/shaderManual/foghull.html b/docs/shaderManual/foghull.html new file mode 100644 index 00000000..2b5f6d66 --- /dev/null +++ b/docs/shaderManual/foghull.html @@ -0,0 +1,108 @@ + + + + + + Q3Map2 Shader Manual + + + + + + + + + +

Foghull

+

Most recent Quake III engine games are programmed with a feature known as distance clipping used to clip (cull) map geometry beyond a user set distance. At the time of Quake III Arena's release, distance clipping was not an available feature. The Q3Map2 foghull feature was designed to simulate true distance clipping for Quake III Arena and Team Arena games.

+ +

What is a Foghull?

+

Farplane distance clipping is a feature used to cull (remove) the drawing of polygons beyond a certain distance from the player in an attempt to improve performance. It is typically used on large, open terrain maps with little vis-blocking structures. Through the use of distance clipping a maximum vis distance is set, which provides the culling of rendered polygons. Fog is used to hide the effect of polygons appearing and disappearing by obscuring the maximum distance that the player can see.

+ +

Since distance clipping is not a feature natively built into Quake III Arena, using distance culling would result in a hall of mirrors (HOM) effect where the culled geometry begins, since nothing is being drawn in the frame buffer. To compensate for this, the foghull feature uses a series of six skybox images that are drawn in place of the absent culled geometry, thus preventing the HOM effect.

+ +

Skybox Images

+

The skybox images used with the foghull feature should never be actually seen since the idea is to use the fog to obsure the maximum distance that the player can see. It only exists to prevent the HOM effect. To pull this off in a convincing manner, the skybox images should be six identical 8x8 pixel (to save on texture memory) textures each filled with a flat color matching the exact color of the fog. The six skybox images must be named in accordance to the skyParms farbox convention, using the _ft, _rt, _bk, _lf, _up, _dn suffixes.

+ +

Foghull Shaders

+

Two shaders are required when using the foghull feature, a fog volume shader and a skybox shader, both of which are simple, standard shaders.

+ +

The color of the fog used must match the color used in the skybox images. Any decent image editing software will give you the three RGB color values of your skybox images, which must be normalized by dividing by 255. As with any other fog shader, the fogParms and surfaceparm fog keywords must be present.

+ +
+textures/env/fog1024
+{
+	fogParms ( 0.8 0.8 0.8 ) 1024	//Normalized RGB, distance to opaque
+
+	surfaceparm fog		//Must be used
+	surfaceparm nolightmap
+	surfaceparm nonsolid
+	surfaceparm trans
+
+	qer_editorImage textures/sfx/fog_grey.tga
+	qer_trans 0.4
+}
+
+ +

The skyParms and surfaceparm sky keywords must be used to create the skybox "hull" of the map. The skyParms farbox value must point to the base name of the skybox images (sans suffix). Optional surface emitted sun lighting can be added using q3map_skylight with q3map_sun or q3map_sunExt (see Appendix I: Light Emitting Shaders).

+ +
+textures/skies/foghullsky
+{
+	skyParms textures/skies/foghullsky 0 -	//farbox cloudheight nearbox
+
+	surfaceparm nolightmap
+	surfaceparm nonsolid
+	surfaceparm sky			//Must be used
+	surfaceparm trans
+}
+
+ +

Entity Key Value Pairs

+

To activate the foghull feature, the _foghull and _farplanedist worldspawn entity key/value pairs must be set in the Entity Inspector (in Radiant, select any non-entity brush and press "N").

+ +

The _foghull key's value works similar to that of terrain entities. It must point to the name of the skybox shader, minus the standard "textures/" prefix. For the skybox shader example above with the shader name "textures/skies/foghullsky", you would use a _foghull value of "skies/foghullsky".

+ +

The _farplanedist value is simply the distance at which polygons will begin to get culled. One important note is that the _farplanedist value must be greater than the distance to opaque value set in the fog shader. In the above fog shader, the distance to opaque value was set to 1024 game units. The _farplanedist value must therefore be greater than 1024, otherwise the HOM effect will appear.

+ + + \ No newline at end of file diff --git a/docs/shaderManual/fur.html b/docs/shaderManual/fur.html new file mode 100644 index 00000000..42c82e39 --- /dev/null +++ b/docs/shaderManual/fur.html @@ -0,0 +1,110 @@ + + + + + + Q3Map2 Shader Manual + + + + + + + + + +

Fur

+

"Fur" shaders allow a surface to replicate itself or another shader above its surface in multiple layers. Care should be taken when using fur shaders, they can quickly cause drops in performance.

+ +Tribble + +

q3map_cloneShader

+

q3map_cloneShader allows the base shader to inherit the target shader's properties and appearance. Beware not to reference another cloning shader or itself as this can lead to an infinite loop. For fur, the base shader is the texture applied to the polygon surface.

+ +
+// base texture
+textures/fur/pink_base
+{
+	// points to the fur shader (see below)
+	q3map_cloneshader textures/fur/pink_fur
+	{
+		map $lightmap
+	}
+	{
+		map textures/fur/pink_base.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+	}
+}
+
+ +

q3map_fur

+

q3map_fur generates additional surfaces above the base shader. The q3map_fur directive takes a few values: layers, offset and fade. Layers controls the number of surfaces generated (start with low values, high values will very quickly cause a reduction in performance). Offset controls the distance between layers. Fade controls how much each additional layer fades in addition to its previous layer. The fur shader shouldn't be applied to surface geometry as it is implicitly generated above the base shader.

+ +
+// fur texture
+textures/fur/pink_fur
+{
+	q3map_lightimage textures/fur/pink_fur.q3map.tga
+
+	q3map_notjunc
+	q3map_nonplanar
+	q3map_bounce 0.0
+	q3map_shadeangle 120
+
+	// format: q3map_fur   
+	q3map_fur 8 1.25 0.1
+
+	surfaceparm trans
+	surfaceparm pointlight
+	surfaceparm alphashadow
+	surfaceparm nonsolid
+	surfaceparm noimpact
+
+	nomipmaps
+	{
+		map textures/fur/pink_fur.tga
+		//alphaFunc GE128
+		blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+		rgbGen vertex
+	}
+}
+
\ No newline at end of file diff --git a/docs/shaderManual/fur.jpg b/docs/shaderManual/fur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dbb01b6dc665395cd3f356e1a1164ff420aeaaef GIT binary patch literal 16494 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 + + + + + Q3Map2 Shader Manual + + + + + + + + + +

General Directives

+

General shader directives are global and affect all stages. They are read by the game engine only and are ignored by Q3Map2.

+ +

skyParms farbox cloudheight nearbox

+

Specifies how to use the surface as a sky, including an optional far box (stars, moon, etc), optional cloud layers with any shader attributes, and an optional near box (mountains in front of the clouds, etc).

+
+
farbox
Specifies a set of files to use as an environment box behind all cloudlayers. Specify "-" for no farbox, or a file base name. A base name of "env/test" would look for files "env/test_rt.tga", "env/test_lf.tga", "env/test_ft.tga", "env/test_bk.tga", "env/test_up.tga", "env/test_dn.tga" to use as the right, left, front, back, up, and down sides.
+
cloudheight
Controls apparent curvature of the cloud layers - lower numbers mean more curvature (and thus more distortion at the horizons). Higher height values create "flatter" skies with less horizon distortion. Think of height as the radius of a sphere on which the clouds are mapped. Good ranges are 64 to 256. The default value is 128.
+
nearbox
Specified as farbox, to be alpha blended ontop of the clouds. This has not be tested in a long time, so it probably doesn't actually work. Set to "-" to ignore.
+
+
+

Design Notes:

+

If you are making a map where the sky is seen by looking up most of the time, use a lower cloudheight value. Under those circumstances the tighter curve looks more dynamic. If you are making a map where the sky is seen by looking out windows most of the time or has a map area that is open to the sky on one or more sides, use a higher height to make the clouds seem more natural.

+

It is possible to create a sky with up to 8 cloudlayers (I don't think this is a physical limit, more of a practical one - see below), but that also means 8 processing passes and a potentially large processing hit.

+

Be aware that the skybox does not wrap around the entire world. The "floor" or bottom face of the skybox is not drawn by the game. If a player in the game can see that face, they will see the "hall of mirrors" effect.

+

There's a bug in Quake 3 (but fixed in Enemy Territory) that causes a shader vertex overflow (SHADER_MAX_VERTEXES HIT IN FILLCLOUD SKY SIDE) if too many cloud layers are used in maps with a lot of visible sky. To compensate, either reduce the amount of visible sky or limit the shader to two cloud layers. Q3Map2 sky portals may be a good alternative if you feel a standard sky isn't interesting enough.

+
+

Q3Map2 sky shaders work differently from the original and contain a number of improvements in terms of efficiency and visually. The example given below is an original Quake III Arena sky shader. While it is still operational, it is a little outdated and is being kept here for legacy purposes only. It is recommended that you take advantage of the new features of Q3Map2 skies by consulting Appendix: Light Emitting Shaders. Below is an example of a default (pre-Q3Map2) Quake 3 sky shader.

+
+textures/skies/xtoxicsky_dm9
+{
+	qer_editorimage textures/skies/toxicsky.tga
+	surfaceparm noimpact
+	surfaceparm nolightmap
+	q3map_globaltexture
+	q3map_lightsubdivide 256
+	q3map_surfacelight 400
+	surfaceparm sky
+	q3map_sun 1 1 0.5 150 30 60
+	skyparms full 512 -
+	{
+		map textures/skies/inteldimclouds.tga
+		tcMod scale 3 2
+		tcMod scroll 0.1 0.1
+	}
+	{
+		map textures/skies/intelredclouds.tga
+		blendFunc add
+		tcMod scale 3 3
+		tcMod scroll 0.05 0.05
+	}
+}
+
+ +

cull side

+

Every surface of a polygon has two sides, a front and a back. Typically, we only see the front or "out" side. For example, a solid block you only show the front side. In many applications we see both. For example, in water, you can see both front and a back. The same is true for things like grates and screens.

+

To "cull" means to remove. The value parameter determines the type of face culling to apply. The default value is cull back if this keyword is not specified. However for items that should be inverted then the value front should be used. To disable culling, the value disable or none should be used. Only one cull instruction can be set for the shader.

+
+
front
The front or "outside" of the polygon is not drawn in the world. It is used if the keyword "cull" appears in the content instructions without a side value.
+
back
Cull back removes the back or "inside" of a polygon from being drawn in the world.
+
disable or none
Neither side of the polygon is removed. Both sides are drawn in the game. Very useful for making panels or barriers that have no depth, such as grates, screens, metal wire fences and so on and for liquid volumes that the player can see from within. Also used for energy fields, sprites, and weapon effects (e.g. plasma).
+
+
+

Design Notes:

+

For things like grates and screens, put the texture with the cull none property on one face only. On the other faces, use a non-drawing texture.

+
+ +

deformVertexes type

+

This function performs a general deformation on the surface's vertexes, changing the actual shape of the surface before drawing the shader passes. You can stack multiple deformVertexes commands to modify positions in more complex ways, making an object move in two dimensions, for instance. There are 6 possible values for the type parameter, each of which will be described in more detail: wave, normal, bulge, move, autosprite, autosprite2. Depending on which of the 6 type parameters are used, different additional parameters will need to be used, including the generalized waveform functions (see Introduction: Key Concepts).

+
+

Design Notes:

+

The div and amplitude parameters, when used in conjunction with liquid volumes like water should take into consideration how much the water will be moving. A large ocean area would have have massive swells (big div values) that rose and fell dramatically (big amplitude values). While a small, quiet pool may move very little.

+
+ +

deformVertexes wave div func base amplitude phase freq

+

Designed for water surfaces, modifying the values differently at each point. The div parameter is used to control the wave "spread" - a value equal to the q3map_tessSize of the surface is a good default value. It accepts the standard wave functions sin, triangle, square, sawtooth or inversesawtooth.

+ +

deformVertexes normal amplitude freq

+

This deformation affects the normals of a vertex without actually moving it, which will effect later shader options like lighting and especially environment mapping. If the shader stages don't use normals in any of their calculations, there will be no visible effect. Good values for amplitude ranges from 0.1 to 0.5 while values of 1.0 to 4.0 are good for frequency.

+
+

Design Notes:

+

Putting values of 0.1 to 0.5 in Amplitude and 1.0 to 4.0 in the Frequency can produce some satisfying results. Some things that have been done with it: A small fluttering bat, falling leaves, rain, flags.

+
+ +

deformVertexes bulge div ampl freq

+

This forces a bulge to move along S texture direction. Designed for use on curved pipes. Div sets how frequently bulges are placed, the bigger value means more bulges. Amplitude parameter is the amount of bulge displacement measured in game units.

+ +

deformVertexes move x y z func base amplitude phase freq

+

The move parameter is used to make a brush, curve patch or model appear to move together as a unit. The x y z values are the distance and direction in game units the object appears to move relative to it's point of origin in the map. The func base amplitude phase freq values are the same as found in other waveform manipulations.

+

The product of the function modifies the values x, y, and z. Therefore, if you have an amplitude of 5 and an x value of 2, the object will travel 10 units from its point of origin along the x axis. This results in a total of 20 units of motion along the x axis, since the amplitude is the variation both above and below the base.

+

It must be noted that an object made with this shader does not actually change position, it only appears to.

+
+

Design Notes:

+

If an object is made up of surfaces with different shaders, all must have matching deformVertexes move values or the object will appear to tear itself apart.

+
+ +

deformVertexes autosprite

+

This function can be used to make any given triangle quad (pair of triangles that form a square rectangle) automatically behave like a sprite without having to make it a separate entity. This means that the "sprite" on which the texture is placed will rotate to always appear at right angles to the player's view as a sprite would. Any four-sided brush side, flat patch, or pair of triangles in a model can have the autosprite effect on it. The brush face containing a texture with this shader keyword must be square.

+ +

deformVertexes autosprite2

+

Is a slightly modified "sprite" that only rotates around the middle of its longest axis. This allows you to make a pillar of fire that you can walk around, or an energy beam stretched across the room.

+ +

fogParms ( r g b ) opacity

+

Fogparms describes how to render the fog on the surfaces. You must also specify "surfaceparm fog" to cause Q3Map2 to identify the surfaces inside the volume.

+
+
r g b
These are normalized values. A good computer art program should give you the RGB values for a color. To obtain the values that define fog color for Quake III Arena, divide the desired color's red, green and blue values by 255 to obtain three normalized numbers within the 0.0 to 1.0 range.
+
opacity
This is the distance, in game units, until the fog becomes totally opaque, as measured from the point of view of the observer. By making the height of the fog brush shorter than the distance to opaque, the apparent density of the fog can be reduced (because it never reaches the depth at which full opacity occurs).
+
+

Fog volume brushes must obey the following rules:

+
    +
  • The fog volume can only have one surface visible (from outside the fog).
  • +
  • Fog must be made of one brush. It cannot be made of adjacent brushes.
  • +
  • Fog brushes must be axial. This means that only square or rectangular brushes may contain fog, and those must have their edges drawn along the axes of the map grid (all 90 degree angles).
  • +
+
+

Design Notes:

+

If a water texture contains a fog parameter, it must be treated as if it were a fog texture when in use.

+

If a room is to be filled completely with a fog volume,it can only be entered through one surface (and still have the fog function correctly).

+

Additional shader passes may be placed on a fog brush, as with other brushes.

+
+ +

noPicMip

+

This causes the texture to ignore user-set values for the r_picmip cvar command. The image will always be high resolution. Example: Used to keep images and text in the heads up display from blurring when user optimizes the game graphics.

+ +

noMipMaps

+

This implies noPicMip, but also prevents the generation of any lower resolution mipmaps for use by the 3D card. This will cause the texture to alias when it gets smaller, but there are some cases where you would rather have this than a blurry image. Sometimes thin slivers of triangles force things to very low mipmap levels, which leave a few constant pixels on otherwise scrolling special effects.

+ +

polygonOffset

+

Surfaces rendered with the polygonOffset keyword are rendered slightly off the polygon's surface. This is typically used for wall markings and "decals." The distance between the offset and the polygon is fixed. It is not a variable in Quake III Arena.

+
+

Design Notes:

+

Use this for wall or floor markings, particularily for direction arrows for team games. Texture the brush with the decal shader on one face and the other faces with a nodraw shader. Then place the brush flush with the surface of the wall or floor.

+

When using a _decal entity for texture projection, polygonOffset must be used to prevent Z-fighting. If you experience problems with depth sorting, try using sort 6.

+
+ +

portal

+

Specifies that this texture is the surface for a portal or mirror. In the game map, a portal entity must be placed directly in front of the texture (within 64 game units). All this does is set "sort portal", so it isn't needed if you specify that explicitly.

+ +

sort value

+

Use this keyword to fine-tune the depth sorting of shaders as they are compared against other shaders in the game world. The basic concept is that if there is a question or a problem with shaders drawing in the wrong order against each other, this allows the designer to create a hierarchy of which shader draws in what order.

+

The default behavior is to put all blended shaders in sort "additive" and all other shaders in sort "opaque", so you only need to specify this when you are trying to work around a sorting problem with multiple transparent surfaces in a scene.

+

The value here can be either a numerical value or one of the keywords in the following list (listed in order of ascending priority):

+
+
portal (1)
This surface is a portal, it draws over every other shader seen inside the portal, but before anything in the main view.
+
Sky (2)
Typically, the sky is the farthest surface in the game world. Drawing this after other opaque surfaces can be an optimization on some cards. This currently has the wrong value for this purpose, so it doesn't do much of anything.
+
Opaque (3)
This surface is opaque (rarely needed since this is the default with no blendfunc)
+
Banner (6)
Transparent, but very close to walls.
+
Underwater (8)
Draw behind normal transparent surfaces.
+
Additive (9)
Normal transparent surface (default for shaders with blendfunc's)
+
Nearest (16)
This shader should always sort closest to the viewer, e.g. muzzle flashes and blend blobs.
+
+ + + + \ No newline at end of file diff --git a/docs/shaderManual/index.html b/docs/shaderManual/index.html new file mode 100644 index 00000000..b8634ae8 --- /dev/null +++ b/docs/shaderManual/index.html @@ -0,0 +1,98 @@ + + + + + + Q3Map2 Shader Manual + + + + + + + +
+ + +
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/shaderManual/light-emitting-shaders.html b/docs/shaderManual/light-emitting-shaders.html new file mode 100644 index 00000000..3ee095ee --- /dev/null +++ b/docs/shaderManual/light-emitting-shaders.html @@ -0,0 +1,254 @@ + + + + + + Q3Map2 Shader Manual + + + + + + + + + +

Light Emitting Shaders

+

Q3Map2 surface light and sky shaders are quite different than the original Quake III shaders. As new lighting algorithms were introduced, new shader keywords were created to accompany or replace the original keywords. This section will illustrate the differences between these shaders.

+ +

Surface Lights

+

(Pending)

+ + +

Skies

+

Originally, sky shaders were just very large surface lights that casted parallel directional lighting. With Q3Map2, there are a few differences that sets sky shaders apart from surface lights. First of all, we'll take a look at how the pre-Q3Map2 shaders were set up:

+ +
+textures/shadermanual/sky
+{
+	skyparms textures/shaderlab_terrain/env/sky 1024 -		//farbox cloudheight nearbox
+
+	q3map_lightImage textures/shaderlab_terrain/sky_clouds.tga
+
+	q3map_sun 1 1 1 140 -35 25	//red green blue intensity degrees elevation
+	q3map_lightSubdivide 256	//sets a pointlight every 256 game units
+	q3map_surfaceLight 200		//emits 200 units of light
+
+	surfaceparm sky				//flags compiler that this is sky
+	surfaceparm noimpact
+	surfaceparm nolightmap
+	surfaceparm nodlight
+
+	nopicmip
+	nomipmaps
+
+	qer_editorimage textures/shaderlab_terrain/sky_clouds.tga
+
+	{
+		map textures/shaderlab_terrain/sky_clouds.tga
+		tcMod scale 3 3
+		//tcMod scroll 0.005 -0.0125
+		rgbGen identityLighting
+	}
+	{
+		map textures/shaderlab_terrain/sky_arc_masked.tga
+		blendFunc GL_ONE_MINUS_SRC_ALPHA GL_SRC_ALPHA
+		tcMod transform 0.25 0 0 0.25 0.1075 0.1075
+		rgbGen identityLighting
+	}
+}
+
+ +

Keep in mind that this is a generalized shader, and that there can be a lot of different variations to yield different effects. Take a look at some of the original Quake III Arena shaders for more examples. In this screenshot (compiled with LIGHT -fast, viewed with /r_lightmap 1), the effect isn't bad, but the shadows are a bit jagged.

+ +sky01 + +

Q3Map2 sky shaders improves on the way lightmaps are calculated, improving both quality and compiler performance. This is essentially the same shader with some small changes:

+ +
+textures/shadermanual/sky
+{
+	skyparms textures/shaderlab_terrain/env/sky 1024 -
+
+	q3map_lightImage textures/shaderlab_terrain/sky_clouds.tga
+
+	q3map_sun 1 1 1 140 -35 25
+	q3map_skylight 100 3			//amount iterations
+
+	surfaceparm sky
+	surfaceparm noimpact
+	surfaceparm nolightmap
+	surfaceparm nodlight
+
+	nopicmip
+	nomipmaps
+
+	qer_editorimage textures/shaderlab_terrain/sky_clouds.tga
+
+	{
+		map textures/shaderlab_terrain/sky_clouds.tga
+		tcMod scale 3 3
+		//tcMod scroll 0.005 -0.0125
+		rgbGen identityLighting
+	}
+	{
+		map textures/shaderlab_terrain/sky_arc_masked.tga
+		blendFunc GL_ONE_MINUS_SRC_ALPHA GL_SRC_ALPHA
+		tcMod transform 0.25 0 0 0.25 0.1075 0.1075
+		rgbGen identityLighting
+	}
+}
+
+ +

What we've done here is replace q3map_lightSubdivide and q3map_surfacelight with q3map_skylight which yields more uniform shadows at a fraction of the compile time. However, this also generates the "stadium light" effect - producing some unwanted shadows. We'll fix this later.

+ +sky02 + +

To solve the problem with jagged shadow edges, we can smooth out the shadows by blurring the lightmap. Depending on the type of lighting that you want to achieve for the sun (a cloudy day, for example), you can create a penumbra (half-shadow) effect using q3map_sunExt. This simulates the way sunlight bounces in certain conditions, creating a slight "jittering" effect. This is the same shader again with q3map_sunExt.

+ +
+textures/shadermanual/sky
+{
+	skyparms textures/shaderlab_terrain/env/sky 1024 -
+
+	q3map_lightImage textures/shaderlab_terrain/sky_clouds.tga
+
+	q3map_sunExt 1 1 1 140 -35 25 3 16		//adds deviance and samples
+	q3map_skylight 100 3
+
+	surfaceparm sky
+	surfaceparm noimpact
+	surfaceparm nolightmap
+	surfaceparm nodlight
+
+	nopicmip
+	nomipmaps
+
+	qer_editorimage textures/shaderlab_terrain/sky_clouds.tga
+
+	{
+		map textures/shaderlab_terrain/sky_clouds.tga
+		tcMod scale 3 3
+		//tcMod scroll 0.005 -0.0125
+		rgbGen identityLighting
+	}
+	{
+		map textures/shaderlab_terrain/sky_arc_masked.tga
+		blendFunc GL_ONE_MINUS_SRC_ALPHA GL_SRC_ALPHA
+		tcMod transform 0.25 0 0 0.25 0.1075 0.1075
+		rgbGen identityLighting
+	}
+}
+
+ +

In the following screenshot, you can see that the jagged shadow edges are gone.

+ +sky03 + +

As mentioned above, you may be faced with problems involving the "stadium lights" effect when using q3map_skyLight. We can eliminate this problem by using higher values for the q3map_sunExt samples and q3map_skyLight iterations parameter, but at the cost of a higher compile time. For example, q3map_sunExt 1 1 1 140 -35 25 3 32 and q3map_skylight 100 6.

+ +
+

Note:

+

Since the time that these screenshots were taken, the skylight subdivision code has been greatly improved (Q3Map2 2.5.14) for far more uniform lighting and faster compiles, so using higher iteration values can result in better quality, reducing the "stadium light" effect and without necessarily increasing compile times.

+
+ +sky04 + +

A faster approximate alternative of getting rid of the "stadium lights" effect is to use q3map_lightmapFilterRadius.

+ +
+textures/shadermanual/sky
+{
+	skyparms textures/shaderlab_terrain/env/sky 1024 -
+
+	q3map_lightImage textures/shaderlab_terrain/sky_clouds.tga
+
+	q3map_sunExt 1 1 1 140 -35 25 3 16
+	q3map_lightmapFilterRadius 0 8		//self other
+	q3map_skyLight 100 3
+
+	surfaceparm sky
+	surfaceparm noimpact
+	surfaceparm nolightmap
+	surfaceparm nodlight
+
+	nopicmip
+	nomipmaps
+
+	qer_editorimage textures/shaderlab_terrain/sky_clouds.tga
+
+	{
+		map textures/shaderlab_terrain/sky_clouds.tga
+		tcMod scale 3 3
+		//tcMod scroll 0.005 -0.0125
+		rgbGen identityLighting
+	}
+	{
+		map textures/shaderlab_terrain/sky_arc_masked.tga
+		blendFunc GL_ONE_MINUS_SRC_ALPHA GL_SRC_ALPHA
+		tcMod transform 0.25 0 0 0.25 0.1075 0.1075
+		rgbGen identityLighting
+	}
+}
+
+ +

The self and other parameters are the amount of filtering applied on the lightmap in world units. The self value is always set to "0" on sky shaders since skies don't have lightmaps. The q3map_lightmapFilterRadius directive should always be placed before any light-related directives that you want it to affect. In our case, we placed it after q3map_sunExt and before q3map_skyLight so that it filters the stadium lights, but won't blur the sun shadows which are already jittered. This produces very similar results without the long compile times.

+ +sky05 + +

Reference: Obsidian (2004). Shader Lighting Experiment, Quake3World (link currently down, see here).

+ + +

Lighting Effects

+

(Pending)

+ + + + + \ No newline at end of file diff --git a/docs/shaderManual/lightstyles.html b/docs/shaderManual/lightstyles.html new file mode 100644 index 00000000..b432f5c5 --- /dev/null +++ b/docs/shaderManual/lightstyles.html @@ -0,0 +1,131 @@ + + + + + + Q3Map2 Shader Manual + + + + + + + + + +

Lightstyles

+

Q3Map2 light styles are a way to simulate flickering/blinking dynamic lights by modulating values between up to 3 different dynamic lightmap styles per surface. This feature was added in Q3Map2 to support Quake 3 and RTCW. SOF2/JK2 already have native support for light styles. Light styles will only affect lightmapped objects, it has no effect on vertex lit objects and the light grid.

+slstyle + +

Worldspawn Keys

+

To create some flickering lights, we need some waveform functions. These are set on the worldspawn entity in Radiant's Entity Inspector using two new available key/value pairs: _styleNrgbGen and _styleNalphaGen keys, where "N" is the style index number, an integer between 1 and 31. Both keys will take standard waveform functions as values. As an example:

+
+_style1alphaGen    wave sin .5 .3 .25 1.5
+_style1rgbGen      wave noise 0.5 1 0 5.37
+_style2alphaGen    wave sin .8 .3 .25 1.5
+_slyle2rgbGen      wave square -.3 1.3 0 5.3
+classname          worldspawn
+
+ +

Lights

+

Next, we need to associate your lights with the style index numbers that were set in the worldspawn. You can add light styles to either light entities or light emitting shaders.

+ +

Light Entities

+

With a light entity selected, open up the Entity Inspector and add a "style" key. Use a value between 1 and 31 matching the style index number previously set in the worldspawn.

+ +

Light Emitting Shaders

+

You can also use q3map_lightStyle N, where "N" is a value between 1 and 31 matching the style index number set in the worldspawn, on light-emitting shaders to have them emit styled light.

+
+textures/slstyle/light
+{
+    q3map_surfacelight 3700
+    q3map_lightStyle 1    // sets style index #1
+    {
+        map $lightmap
+        rgbGen identity
+    }
+    q3map_styleMarker     // note: after the $lightmap stage
+    {
+        map textures/slstyle/light.tga
+        blendFunc GL_DST_COLOR GL_ZERO
+        rgbGen identity
+    }
+    {
+        map textures/slstyle/light.blend.tga
+        blendfunc GL_ONE GL_ONE
+    }
+}
+
+ +

Lightmapped Surfaces

+

For any shaders that may be hit by a styled light, you'll need to add q3map_styleMarker after the lightmap stages and before the texture stages so Q3Map2 can properly create the fake lightmap stages. For masked textures where a depthFunc equal is required, add q3map_styleMarker2.

+

Shaders with lightmaps after texture passes will look odd. This may change in the future. Try to rearrange your shaders, if possible, to have lightmaps first.

+
+textures/slstyle/plywood2sided
+{
+    cull none
+    qer_editorImage textures/slstyle/plywood-2-tone.tga
+    {
+        map $lightmap
+        rgbGen identity
+    }
+    q3map_styleMarker     // note: after the $lightmap stage
+    {
+        map textures/slstyle/plywood-2-tone.tga
+        blendFunc GL_DST_COLOR GL_ZERO
+        rgbGen identity
+    }
+}
+
+ +

Compiling

+

Compile your map with Q3Map 2.5.5-test-6 or later. Be sure to use the -nocollapse switch in the -light phase. This is important, because styled lights generate shaders, and this minimizes the number of unique shaders.

+

In game, you might get a warning message in the console, "WARNING: reused image *lightmap4 with mixed glWrapClampMode parm", which you can safely ignore.

+ +

References

+ + + + \ No newline at end of file diff --git a/docs/shaderManual/lightstyles.jpg b/docs/shaderManual/lightstyles.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4b580fd832a2a5796dc5ec0786ade6803db8427 GIT binary patch literal 28929 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 S%g@ByBm$LAX5`25>7_ps-&i#O literal 0 HcmV?d00001 diff --git a/docs/shaderManual/navlow.png b/docs/shaderManual/navlow.png new file mode 100644 index 0000000000000000000000000000000000000000..7d64a9cfca21f4636f8c4e17db0ebc1e0cd77495 GIT binary patch literal 1049 zcmaJ=PiWIn7*8#-IULiAqF$caK|z~;T~`}h$J#Wmu$0mk*UMm8^16mCd0FyivmF&d z4+??@ui|~+c}QhDi4+v)7}Cq8*C7L8hYjXS*K{7N@9^@yFTdaK`}4l{tdPGyIB<1< zqNu^#gjA%c5HYF#{xI3EKmGEYe6HYZ1(#42*Hs5n<2ss!AZMy`un1LsdGRAmQdAfi z7UbZ1ygf3cgG;(p(VLy~DW*n$uZjajPp&@*rcEMC&@moDU3QQO+69Y7?_9W^dL6FbI~Tqu zmnF%t{idNwT!Nv+hotO)nM? zq6a~5;z1Bgj}?z98fii6p{O7|ND))K7AXihw4k$Tl6o-CVfM}2@B7}*yt$jpUKtu3 z8Kfv`C^IGHDauDoYGA-m_Oo|B-y@&XI90+0RK_*MhEzgBvk+tqr2_L%(dsuoz;TN5 z1HD+nC3#vxFU-gE?4q}#dzu{}3SgEj=uiS$uYB{>I@$c7-oZ~>Kz zav;hxd?*}?#V&#%$8#(fWcgr#j|rimz;U3nXcEoV%0gaBcVdx~NLMko1eUGUYD_J} zAiKiy@p# zSXZ%Fp5eTbx))bj~B0Pk_QpUO&3!;J3D)Od%L^4 z&1Uo9;GorN?eFhzZEYPM9Ctj(<^7{&B1C0US!r$Z`mH~!ZflAF literal 0 HcmV?d00001 diff --git a/docs/shaderManual/preface.html b/docs/shaderManual/preface.html new file mode 100644 index 00000000..50d457d9 --- /dev/null +++ b/docs/shaderManual/preface.html @@ -0,0 +1,103 @@ + + + + + + Q3Map2 Shader Manual + + + + + + + + + +

The Q3Map2 Edition

+

Q3Map2 is an updated version of the original Q3Map program used to compile .map files created in a level editor such as Radiant into .bsp files used by id Tech 3 games. Since it's introduction, ydnar has added so many new features and improved efficiency to the degree where Q3Map2 has become the standard compiling program for the level editing community as well as for many commercial games.

+

The Q3Map2 Edition is built off of the original QeRadiant Shader Manual written by the staff at id Software, improving upon it by including new shader directives introduced by Q3Map2, while expanding on the original content.

+

This is currently the second edition of the Q3Map2 Shader Manual. It has been rewritten and converted to W3C compliant XHTML 1.0 Strict specifications. It is currently an actively developed project so check back for updates.

+ +

Using the Manual

+

(Pending)

+ +

Credits

+ +

Q3Map2 Edition

+
+
Author
+
Obsidian
+
Additional material
+
ydnar
+
TTimo
+
+ +

QeRadiant Shader Manual, Revision #12

+
+
Author
+
Paul Jaquays
+
Brian Hook
+
Additional material
+
John Carmack
+
Christian Antkow
+
Kevin Cloud
+
Adrian Carmack
+
HTML conversion
+
John Hutton
+
+ +

Contact

+ +

Support Forums

+ + +

Shader Manual Development

+

The new official home for the Q3Map2 Shader Manual is now located at robotrenegade.

+

Feel free to e-mail me (Obsidian) if you have any suggestions, comments or error corrections: obsidian-at-robotrenegade-dot-com

+ + +

Quake, Quake III Arena, Quake Live and logos are registered trademarks of id Software, Inc.

+

Q3Map2 and the Q3Map2 Shader Manual is not an id Software product and is not officially supported. Do not contact them for support.

+

The Q3Map2 Shader Manual is protected under a Attribution-Noncommerical-Share Alike Creative Commons license. Some rights reserved.

\ No newline at end of file diff --git a/docs/shaderManual/q3map-global-directives.html b/docs/shaderManual/q3map-global-directives.html new file mode 100644 index 00000000..104bf420 --- /dev/null +++ b/docs/shaderManual/q3map-global-directives.html @@ -0,0 +1,441 @@ + + + + + + Q3Map2 Shader Manual + + + + + + + + + + +

Q3Map Global Directives

+

Q3Map2 global directives change the physical nature of the textures and the brushes that are marked with them. Changing any of these values will require the map to be re-compiled. These are global and affect the entire shader.

+ +

q3map_alphaGen func

+

Currently takes a single function, const. This directive is used to set a surfaces vertex alpha values. q3map_alphaGen operations are applied to an object's vertexes so the alphaGen vertex directive is required for each affected stage.

+ +

q3map_alphaGen const norm

+

Forces a fixed vertex alpha value to the entire shader surface, useful for controlling transparency or blending. Values are a normalized number.

+ +

q3map_alphaMod func

+

This is used for special vertex alpha blending effects on surfaces by altering the vertex alpha values depending on specific surface properties, such as the surfaces normal axis or the vertexes contained within its volume. q3map_alphaMod operations are applied to an object's vertexes so the rgbGen vertex directive is required for each affected stage.

+ +

q3map_alphaMod dotproduct ( X Y Z )

+

Used to blend textures using alphaFunc or blendFunc in the shader's second pass, with the transparency depending on the surface's normal axis vector. This is achieved by taking the user specified vector ( X Y Z ) and applying a dotproduct calculation with the generated vertex normal vector to yield a normalized vertex alpha value. The dot product operation multiplies each element of one vector against the corresponding elements of a second vector, then adds them:

+

Used to blend textures using alphaFunc or blendFunc in the shader's second pass, with the transparency depending on the surface's normal axis vector. This is achieved by taking the user specified vector ( X Y Z ) and applying a dotproduct calculation with the generated vertex normal vector to yield a normalized vertex alpha value. The dot product operation multiplies each element of one vector against the corresponding elements of a second vector, then adds them:

+
+( 0 0 1 ) dp ( 0 0 1 ) = 0 * 0 + 0 * 0 + 1 * 1 = 1
+( 0 0 1 ) dp ( 0 0 0.5 ) = 0 * 0 + 0 * 0 + 1 * 0.5 = 0.5
+( 0.5 0.5 1 ) dp ( 0 0.5 0.5 ) = 0.5 * 0 + 0.5 * 0.5 + 1 * 0.5 = 0.75
+
+

In a practical sense, you can think of the dotproduct vector ( 0 0 0.9 ) as meaning that all vertex normal vectors pointing straight up along the z-axis ( 0 0 1 ) will have a vertex alpha value of 90% opacity.

+ +

q3map_alphaMod dotproduct2 ( X Y Z )

+

This works in a similar way to dotproduct except it exaggerates the differences in vertex normals by squaring the final dot product value. With the same values as the above example, dotproduct2 would give the following:

+
+[ ( 0 0 1 ) dp ( 0 0 1 ) ]2 = ( 0 * 0 + 0 * 0 + 1 * 1 )2 = 1
+[ ( 0 0 1 ) dp ( 0 0 0.5 ) ]2 = ( 0 * 0 + 0 * 0 + 1 * 0.5 )2 = 0.25
+[ ( 0.5 0.5 1 ) dp ( 0 0.5 0.5 ) ]2 = ( 0.5 * 0 + 0.5 * 0.5 + 1 * 0.5 )2 = 0.5625
+
+

Example q3map_dotproduct shader for terrain:

+
+textures/shaderlab_vector_1/rock_1_z_lodterrain
+{
+	//Used for radiosity lighting
+	q3map_lightImage textures/shaderlab_vector_1/rock_1.tga
+
+	q3map_nonplanar
+	q3map_shadeAngle 179
+	q3map_tcGen ivector ( 512 0 0 ) ( 0 512 0 )
+	q3map_tcMod rotate 33
+	q3map_lightmapAxis z
+
+	// this means dot product squared, for faster falloff between vertical and horizontal planes
+	q3map_alphaMod dotproduct2 ( 0 0 0.95 )
+
+	surfaceparm nonsolid
+	surfaceparm pointlight
+
+	{
+		map textures/shaderlab_vector_1/rock_1.tga
+		rgbGen vertex
+	}
+	{
+		map textures/slterra/sand_1.tga
+		blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
+		rgbGen vertex
+	}
+}
+
+
+

Design Notes:

+

Typical examples of use include snow covering the top faces of objects, or terrain with grass growing on horizontal planes blending into rocky cliffs on near vertical surfaces. It is an excellent way of automatically creating realistic alpha-blended terrain without the complicated steps of setting up an alpha map.

+
+ +

q3map_alphaMod scale norm

+

Used in conjunction with q3map_alphaMod volume. Scales the vertex alpha by the specified normalized number value.

+ +

q3map_alphaMod set norm

+

Used in conjunction with q3map_alphaMod volume. Sets the vertex alpha (regardless of any previous alpha values) to the specified normalized number value.

+ +

q3map_alphaMod volume

+

This was created as a way to explicitly set or modify the vertex alpha values of vertex points contained within a controlling brush volume marked with this shader directive. Applies all other q3map_alphaMod directives to each vertex inside a brush textured with this shader, allowing large faded scrolling fire shaders, waterfalls, marquees, explicit dotProduct terrain blending control, etc. +

+
+

Design Notes:

+

This is usually used in special alphaMod volume "common" shaders for use within the editor only. A brush textured with the alphaMod volume shader is used to overlap the vertexes of another brush or model using an alpha-blended shader, altering the vertex alpha values. Worldspawn alphaMod volume brushes will affect all surfaces it comes in contact with. You can func_group an alphaMod volume brush to its affecting brush to localize the blend to just that entity.

+
+ +

q3map_backShader shadername

+

This allows a brush to use a different shader when you are inside it looking out. By way of example, this would allow a water brush (or other) surfaces to have a different sort order or appearance when seen from the inside. q3map_backShader only works on brush faces. For this reason, it is often deprecated in favor of using q3map_cloneShader where the target shader contains q3map_invert. It can still be useful as a kind of shorthand.

+ +

q3map_backSplash percentage distance

+ +

A surface light is lit by itself, often causing areas of higher light intensity than other areas. q3map_backSplash moves the light source away from the surface of the shader, allowing it to create smoother lighting over the face. By default, all shaders are assigned backsplash values, 5 for percentage, 23 units for distance.

+ +
+
percentage
+
Specifies the intensity percentage of the light generated by q3map_surfacelight to be redirected back at the surface. Use a value of 0 or a negative value to disable back splash lights.
+
distance
+
Distance of the back splash lights from the surface.
+
+ +

q3map_baseShader shadername

+

Allows shaders to be subclassed (Q3Map2 relevant portions only, such as surfaceparms, lighting, texture projection, etc). Subclassed shaders can reference the base shader by referring to the base shader's name. In order for q3map_baseShader to work correctly, the base shader must be specified before any shaders that subclass it. Some EasyGen terrain templates incorrectly specified the base shader after the terrain shaders that depended on it, resulting in some interesting errors.

+

This is fundamentally the reverse of q3map_remapShader. Use q3map_baseShader when a single group of q3map_* directives is required for multiple base shaders. Use q3map_remapShader when similar shaders are used that require different groups of q3map_* directives.

+ +

q3map_bounce N.N

+

Deprecated! Use q3map_bounceScale instead.

+ +

q3map_bounceScale N.N

+

Takes positive decimal number values between 0 and 1.0 (or higher), to scale the amount of light reflected in radiosity passes. You can oversaturate it by using a number higher than 1.0, but this can lead to excessive compile times. Using 90 would probably make things positively glacial. 1.0 is a default, fudged number that looked OK with the maps that were tested. Tweaking it to 1.5 or 2.0 won't hurt anything per se, but it does give you finer control over how each shader re-emits light. The poorly worded q3map_bounce has been renamed to q3map_bounceScale. While its use has been deprecated, q3map_bounce still works.

+ +

q3map_clipModel

+

Automatically clips misc_model entities for player and weapon collision. This should only be used on large models such as terrain (not small decorative models - manually clip those). The shader's surfaceparms are inherited by the magic clip brush, so if you have surfaceparm nonsolid in your model's shader that uses q3map_clipModel, then the brush will also be non-solid. This can also be set on a per model basis with the entity key/value pair, spawnflags 2.

+ +

q3map_cloneShader shadername

+

A shader with this directive will inherit the target shader's properties and appearance. Be careful, this can lead to an infinite loop if a cloning shader references another cloning shader or itself.

+ +

q3map_colorGen func

+

Currently takes a single function, const. This directive is used to set a surfaces vertex color values. q3map_colorGen operations are applied to an object's vertexes so the rgbGen vertex directive is required for each affected stage. Same as q3map_rgbGen.

+ +

q3map_colorGen const ( R G B )

+

Forces a fixed vertex color value to the entire shader surface.

+ +

q3map_colorMod func

+

Used to alter the vertex color values of vertexes contained within its volume. q3map_colorMod operations are applied to an object's vertexes so the rgbGen vertex directive is required for each affected stage. Possible uses include creating a neutral hued texture for a CTF middleground and then creating shader instances of the texture for red and blue bases. Same as q3map_rgbMod.

+ +

q3map_colorMod scale ( R G B )

+

Used in conjunction with q3map_colorMod volume. Scales the vertex color by the specified color values.

+ +

q3map_colorMod set ( R G B )

+

Used in conjunction with q3map_colorMod volume. Sets the vertex color to the specified color values.

+ +

q3map_colorMod volume

+

This was created as a way to explicitly set or modify the vertex color values of vertex points contained within a controlling brush volume marked with this shader directive. Applies all other q3map_colorMod directives to each vertex inside a brush textured with this shader to change the hue of the affected surface.

+
+

Design Notes:

+

This is usually used in special colorMod volume "common" shaders for use within the editor only. A brush textured with the colorMod volume shader is used to overlap the vertexes of another brush or model, altering the vertex color values. Worldspawn colorMod volume brushes will affect all surfaces it comes in contact with. You can func_group a colorMod volume brush to its affecting brush to localize the hue to just that entity.

+
+ +

q3map_colorMod dotproduct ( X Y Z )

+

q3map_colorMod dotproduct2 ( X Y Z )

+

These ones work just like q3map_alphaMod dotproduct, but are modifying vertex color values. +

+ + +

q3map_fogDir X Y Z

+

Specifies the direction a fog shader fades from transparent to opaque. Values indicate a directional vector.

+ +

q3map_forceMeta

+

Forces model (MD3, ASE, etc.) surfaces to be broken down into their component triangles like brush faces and passed through the meta code on a per shader basis. This is required for lightmapped models. Setting spawnflags 4 on a misc_model will set q3map_forceMeta on all its surfaces.

+ +

q3map_forceSunlight

+

Obsolete! By default, no sunlight is cast on vertex-lit .md3 models or vertex-lit terrain. Using this option, sunlight (overbright bits created by the q3map_sun option) will be cast on these surfaces. q3map_forceSunlight is now obsolete since suns are now first class light sources.

+ +

q3map_fur layers offset fade

+

This is used for generating fur over a surface. This is typically used in conjunction with q3map_cloneShader in the surface (parent) shader and references the fur shader as the clone. A possible application of this is to create grass on alphablended terrain. Keep in mind that the use of a fur shader may cause a large hit to performance but when used sparingly, it can produce some interesting effects. (See Appendix: Fur)

+ +
+
layers
This specifies the number of desired replicated fur layers generated.
+
offset
The distance (in game units) between subsequent layers.
+
fade
A normalized value indicating the fade falloff between subsequent layers.
+
+ +

q3map_globalTexture

+

Use this shader in the global directive commands whenever the tcMod scale function is used in one of the later render stages. Many problems with getting shader effects to work across multiple adjacent brushes are a result of the way Q3Map2 optimizes texture precision. This option resolves that, but at the expense of some precision of the textures when they are far away from the origin of the map.

+ +

q3map_indexed

+

This is used for explicit terrain-style indexed mapping. It instructs Q3Map2 to look at the func_group terrain entity's _indexmap key for an image to pull index values from, and then to construct a shader name with the root based on the _shader key's value.

+ +

q3map_invert

+

Inverts a surface normal. Works on brush faces, models and patches. Used in celshading to achieve the inverted backfacing hull. Can be used with a shader that is targeted by q3map_cloneshader for something similar to q3map_backShader.

+ +

q3map_lightImage texturename

+

By default, surface lights use the average color of the source image to generate the color of the light. q3map_lightImage specifies an alternate image to be used for light color emission, radiosity color emission, light filtering and alpha shadows. You can even use a light image with a different alpha channel for blurrier alpha shadows. The light color is averaged from the referenced texture. The texture must be the same size as the base image map. q3map_lightImage should appear before qer_editorImage.

+

The reason q3map_lightImage is specified for the light in the example below, is because the blend map is predominantly yellow, but the base image is not. The designer wanted the color of the light to be sampled from the blend map instead of the base image. +

+textures/eerie/ironcrosslt2_10000
+{
+	// this TGA is the source for the color of the blended light
+	q3map_lightImage textures/gothic_light/ironcrosslt2.blend.tga
+
+	//editor TGA (used because the shader is used with several different light values)
+	qer_editorImage textures/gothic_light/ironcrosslt2.tga
+
+	//emitted light value of 10,000
+	q3map_surfacelight 10000
+
+	{
+		//source texture is affected by the lightmap
+		map $lightmap
+
+		// this command handles the overbright bits created by "sunlight" in the game
+		rgbGen identity
+	}
+	{
+		map textures/gothic_light/ironcrosslt2.tga
+		blendFunc filter
+		rgbGen identity
+	}
+	{
+		maptextures/gothic_light/ironcrosslt2.blend.tga
+		blendFunc add
+	}
+}
+
+ +

q3map_lightmapAxis axis

+

Takes a single argument: either x, y or z as the direction from which the lightmap is projected from. The directive q3map_terrain has an implicit (read default) q3map_lightmapAxis defined as z. This directive is not recommended for things like caves or arches which have undersides.

+ +

q3map_lightmapBrightness N.N

+

Lightmap brightness scaling. A value of 2.0 will be twice as bright (linearly) and a value of 0.5 will be half as bright.

+ +

q3map_lightmapFilterRadius self other

+

This is usually used on light emitting shaders to approximate finer subdivided lighting. It adds a gaussian blur effect to the lightmaps of either the shader itself, or the surfaces affected by the shader, or both. The values for self and other are measured in world units of filtering (blurring) of lightmap data cast by any light sources.

+
+
self
Amount of blur set for the shader itself to approximate for the surfacelight's finer subdivided lighting. It should be set to 0 for sky shaders since they don't have lightmaps.
+
other
Amount of blur set for other surfaces affected by this shader's emitted light. It should be set just high enough to eliminate the "stadium shadow" effect sometimes produced by q3map_skylight or to smooth out the lighting on surfacelights.
+
+

If using a value higher than 4 for the iterations parameter on q3map_skylight, you don't need q3map_lightmapFilterRadius as much, but at the expense of higher compile times. q3map_lightmapFilterRadius should be placed before any light related shader directives that you want it to affect. (see Appendix: Light Emitting Shaders)

+ +

q3map_lightmapGamma N.N

+

Deprecated! Use q3map_lightmapBrightness instead.

+ +

q3map_lightmapMergable

+

Allows surfaces like terrain to be mapped onto a single lightmap page for seamless terrain shadows. It will specify that the shaders using it can merge nonplanars together onto a single lightmap, so you can have a single 512x512 lightmap across a terrain entity. Note that most id Tech 3 engine games are limited to lightmap pages of 128x128. You may need to experiment with q3map_lightmapSize and the Q3Map2 -export general switch.

+ +

q3map_lightmapSampleOffset distance

+

Takes a single parameter, defaulting to 1.0, which specifies how many units off a surface should Q3Map2 sample lighting from. Use larger values (2.0-8.0) if you're getting ugly splotches on lightmapped terrain. Try to use filtering to solve splotches if possible, leaving q3MaplightmapSampleOffset as a last resort.

+ +

q3map_lightmapSampleSize N

+

Surfaces using a shader with this option will have the pixel size of the lightmaps set to N world grid units. This option can be used to produce high-resolution shadows on certain surfaces. In addition, it can be used to reduce the size of lightmap data, where high-resolution shadows are not required, gaining memory and performance benefits. The default Quake III lightmap sample size is 16, smaller numbers increases lightmap resolution. In general, you should stick with power of 2 values.

+ +

q3map_lightmapSize width height

+

Specifies the size of the lightmap page that surface lightmaps get packed on to. Used mainly in Enemy Territory for terrain lightmaps (512x512) in concert with the Q3Map2 switch -lightmapsize. Most idTech 3 games will only support internal lightmap pages of 128x128. Larger pages will result in lightmaps exported externally from the .bsp file.

+ +

q3map_lightRGB red green blue

+

This forces a specified color of light to be emitted from a surface or sky light, rather than sampling colors from a lightimage, editor image or the texture map. Three normalized color values of light are required for the red green blue parameters. This does not affect bounced light in radiosity or lightfilter.

+ +

q3map_lightStyle N

+

Used to set light styles on surface lights for lightmap flickering/waveform effects. N takes the form of a number between 1 and 31, that references the corresponding style number set in the worldspawn entity. Equivalent to setting "style" "N" on a light entity (see Appendix: Lightstyles).

+ +

q3map_lightSubdivide N

+

Used on surface lights (see q3map_surfacelight). Controls the distance between surface generated light sources for uniform lighting. It defaults to 120 game units, but can be made larger or smaller as needed (for light surfaces at the bottom of cracks, for example). This can be a dominant factor in processing time for Q3Map2 lighting. Can have an increasingly "darker" effect when used with -fast. Compensate by raising the surface light value. For sky shaders, use q3map_skylight instead (see Appendix: Light Emitting Shaders).

+ +

q3map_noClip

+

You might have noticed that terrain has been made to not clip or t-junction anymore. It was causing too many issues, so a new parameter was added: q3map_noClip. Normally, Q3Map2 clips all faces to the BSP, and then takes the minimum polygon that encompasses all visible fragments. q3map_noClip forces Q3Map2 to uses the original brush faces (This is implicit for autosprite(2) surfaces). Therefore, if you map tidy, you could theoretically use q3map_noClip on all your shaders. q3map_noClip and q3map_noTJunc, when used in combination, will preserve mesh geometry exactly as you make it.

+ +

q3map_noFast

+

When used on surfaces that emit light, this will disable -fast optimizations. This is useful for large areas of dim sky, where you want the dim light to reach all surfaces. This shader directive prevents fast from affecting dim sky surfaces. It is necessary, if you can't do a workaround with brighter skies or by using a larger q3map_lightSubdivide value.

+ +

q3map_noFog

+

Volumes marked with a shader containing this directive will not be affected by fog. For example, it can be used on sky shaders to prevent the fog from affecting it.

+ +

q3map_nonPlanar

+

Instructs Q3Map2 to merge any adjacent triangles that don't lie in the same plane into a non-planar triangle soup. This allows shadows to be cast correctly across non-planar edges. It is typically used on lightmapped terrain shaders.

+ +

q3map_normalImage texturename

+

Allow the use of a normal (height) map to simulate textured bumpmapping. This isn't real bumpmapping per se, but generates a static lightmap image that reflects the normal map and light source.

+ +

q3map_noTJunc

+

Read as "no T-Junc". With this option, surfaces modified by a shader are not used for T-junction fixing. q3map_noClip and q3map_noTJunc, used in combination will preserve mesh geometry exactly as you make it.

+ +

q3map_noVertexLight

+

Suppresses Q3Map2 from overwriting the BSP-phase set vertex RGB values.

+ +

q3map_noVertexShadows

+

Obsolete! Vertex lighting code was rewritten a couple of times, rendering this directive irrelevant. Shaders that are used on misc_models or terrain were to use q3map_noVertexShadows to disable shadows being cast on the vertex lit surfaces. Casting shadows at small, misc_model objects often makes sense. However, having shadows on large, vertex lit terrain surfaces often looks bad. Shadows are not cast on forced_vertex_lit surfaces by default (shaders with pointlight).

+ +

q3map_offset N.N

+

Offsets a surface along the vertex normals by N.N units. Used in celshading for those black edges.

+ +

q3map_patchShadows

+

Obsolete! When this option is used in conjunction with the original lighting algorithm (-light), surfaces with textures modified with this option will show shadows that are cast by curve patches. Curve patches do not cast shadows by default. You would usually force patches to cast shadows by using the -patchshadows Q3Map2 switch.

+ +

q3map_remapShader shadername

+

Allows shaders to be subclassed. Subclassed shaders can reference the remap shader by referencing the remap shader's name. In order for this to work, the remap shader must be specified before any shaders that references it. Subclassed shaders must contain Q3Map2 and editor relevant portions only (q3map_*, surfaceparm and qer_* directives).

+

This is fundamentally the reverse of q3map_baseShader. Use q3map_baseShader when a single group of q3map_* directives is required for multiple base shaders. Use q3map_remapShader when similar shaders are used that require different groups of q3map_* directives.

+
+

Design Notes:

+

Since the subclassed shaders that are applied to geometry does not contain any texture stages, qer_editorImage is usually required in conjunction with q3map_remapShader.

+
+ +

q3map_rgbGen func

+

Same as q3map_colorGen

+ +

q3map_rgbMod func

+

Same as q3map_colorMod

+ +

q3map_shadeAngle angle

+

Specifies the breaking angle for phong shading. This allows for smooth shadows between brush faces like patches. The angle parameter is the angle between adjacent faces at which smoothing will start to occur. Typical values are usually in the 120-179 range.

+ +

q3map_skylight amount iterations

+

This replaces q3map_surfacelight and q3map_lightSubdivide on sky surfaces for much faster and more uniform sky illumination. Amount is a brightness value, similar to what you would use in q3map_sun. Good values are between 50 and 200. Iterations is an exponential factor. 3 is the best value that balances speed and quality. Values of 4 and 5 are higher quality at the expense of higher compile time. Values below 3 are not too useful. See Appendix: Light Emitting Shaders.

+ +

q3map_splotchFix

+

This is used on lightmapped model shaders if splotched lighting artifacts appear. Any shadows at the ambient/dark level will be flooded from neighbouring luxels. This gets rid of shadow acne, but a surface must be more or less uniformly lit or this looks ugly. Try using q3map_lightmapSampleOffset first before using this as a last resort.

+ +

q3map_styleMarker

+

For use on shaders that accompany style lights. For any shaders that may be hit by a styled light, add q3map_styleMarker after the lightmap stage and before the texture stages so Q3Map2 can properly create the fake lightmap stages (see Appendix: Lightstyles).

+ +

q3map_styleMarker2

+

Similar to q3map_styleMarker except it is used on masked textures where a depthFunc equal is required.

+ +

q3map_sun red green blue intensity degrees elevation

+

This directive in a sky shader will create the illusion of light cast into a map by a single, infinitely distance parallel light source (sun, moon, hellish fire, etc.). This is only processed during the lighting phase of Q3Map2. While still perfectly usable, q3map_sun is now deprecated in favour of q3map_sunExt (see below).

+ +

q3map_sunExt red green blue intensity degrees elevation deviance samples

+

Works like q3map_sun with the addition of two new parameters to create "light jittering" for penumbra (half-shadow) effects. This gives you much more realistic shadows from the sun, especially when trying to simulate a cloudy day or a wide sun. The penumbra effect can also be applied to entity lights (point, spot or sun) with the _deviance N (distance in world units for point/spot lights and degrees for suns) and _samples N (number of samples) key/value pairs.

+
+
red green blue
Color is described by three normalized RGB values. Color will be normalized to a 0.0 to 1.0 range, so it doesn't matter what range you use.
+
intensity
The brightness of the generated light. A value of 100 is a fairly bright sun. The intensity of the light falls off with angle but not distance.
+
degrees
The angle relative to the directions of the map file. A setting of 0 degrees equals east. 90 is north, 180 is west and 270 is south. In the original version of Q3Map, non-axial values had a tendency to produce jagged shadows. With Q3Map2, this problem is avoided with new options like lightmap filtering, raytracing and penumbra effects.
+
elevation
The distance, measured in degrees from the horizon (z value of zero in the map file). An elevation of 0 is sunrise/sunset. An elevation of 90 is noon.
+
deviance
The number of degrees for the half-shadow. General values up to 2 or 3 are acceptable. The real sun has a solid angle of about half a degree.
+
samples
The number of random jitters distributed over the solid arc (~16).
+
+
+

Design Notes:

+

Sky shaders should probably still have a q3map_surfacelight or preferred q3map_skylight value. The "sun" gives a strong directional light, but doesn't necessarily give the fill light needed to soften and illuminate shadows. Skies with clouds should probably have a weaker q3map_sun value and a higher q3map_surfacelight or q3map_skylight value. Heavy clouds diffuse light and weaken shadows. The opposite is true of a cloudless or nearly cloudless sky. In such cases, the "sun" or "moon" will cast stronger shadows that have a greater degree of contrast. This is also why q3map_sunExt is preferred. It gives the designer greater control over shadow contrast with a penumbra effect.

+

Design Notes:

+

Not certain what color formula you want to use for the sun's light? Try this. Create a light entity. Use the Radiant editor's color selection tools to pick a color. The light's _color key's value will be the normalized RGB formula. Copy it from the value line in the editor (CTRL+c) and paste it into your shader.

+
+ +

q3map_surfaceLight value

+

The texture gives off light equal to the value set for it. The relative surface area of the texture in the world affects the actual amount of light that appears to be radiated. To give off what appears to be the same amount of light, a smaller texture must be significantly brighter than a larger texture. Unless the q3map_lightImage or q3map_lightRGB directive is used to select a different source for the texture's light color information, the color of the light will be the averaged color of the texture. For sky shaders, use q3map_skylight instead for faster and more uniform sky illumination.

+ +

q3map_surfaceModel modelpath density odds minscale maxscale minangle maxangle oriented

+

A surface with q3map_surfaceModel in its shader will randomly place a specified model across it's face. This is designed to place grass or tree models over terrain.

+
+
modelpath
The path to the model file (any supported format).
+
density
The density of the models, in game units.
+
odds
The odds of the model appearing (normalized?).
+
minscale
The minimum scale of the model from its original size of 1.0.
+
maxscale
The maximum scale of the model from its original size of 1.0.
+
minangle
The model's minimum angle of rotation.
+
maxangle
The model's maximum angle of rotation.
+
oriented
This is a flag, either 0 or 1, and sets whether the model gets fitted to the orientation of the surface.
+
+ +

q3map_tcGen func

+

This currently supports two functions, vector and ivector. Both functions are used for texture projection and do the exact same thing. The only difference is in the math, ivector was designed to be more intuitive.

+ +

q3map_tcGen vector sVector tVector

+

Projects a texture Ns units by Nt units along a chosen axis. q3map_tcGen vector ( 1/256 0 0 ) ( 0 1/256 0 ) will project a texture every 256 units in x, and every 256 units in y, along the z-axis.

+ +

q3map_tcGen ivector 1.0/sVector 1.0/tVector

+

Projects a texture Ns units by Nt units along a chosen axis. q3map_tcGen ivector ( 256 0 0 ) ( 0 256 0 ) will project a texture every 256 units in x, and every 256 units in y, along the z-axis. Ivector means inverse vector, and this means you won't have to do the divide with a calculator. Inverse = 1.0/n, unless the value is 0, then the matrix value is set to 0. A bit of dodgy math, but it works.

+ +

q3map_tcMod func

+

This works in a similar manner to the stage specific tcMod directive (see Stage Directives: tcMod), except in the compiler, so that modified texture coordinates are "baked" into the surface. This lets you set up less obvious texture tiling on natural and organic surfaces (especially terrain).

+ +

q3map_tcMod rotate degrees

+

Rotates the texture (around origin, not center) a specified number of degrees.

+ +

q3map_tcMod scale s-scale t-scale

+

Scales S (x) and T (y) texture co-ordinates. scale 2 2 would halve the size of the texture (doubling the texture co-ordinates).

+ +

q3map_tcMod translate or move or shift s-offset t-offset

+

Shifts texture co-ordinates by S, T amount. translate 0.5 0 would shift it one-half in S, and none in T.

+ +

q3map_terrain

+

Alphamap terrain shaders (typically textures/common/terrain and terrain2) must have the q3map_terrain directive. Terrain is handled completely differently from previous versions. Q3Map2 no longer looks for the word terrain in the shader name to determine whether or not it is an indexed shader. It looks for q3map_indexed, or q3map_terrain, which then sets off a bunch of stuff shoehorned into it, like: the lightmap axis, texture projection, etc.

+

By default, q3map_terrain sets the following:

+
+q3map_tcGen ivector ( 32 0 0 ) ( 0 32 0 )
+q3map_lightmapAxis z
+q3map_nonplanar
+q3map_shadeAngle 180 //(maybe 175?)
+q3map_indexed
+
+ +

q3map_tessSize amount

+

This controls the tessellation size (how finely a surface is chopped up in to triangles), in game units, of the surface. This is only applicable to solid brushes, not curves, and is generally only used on surfaces that are flagged with the deformVertexes directive. Abuse of this can create a huge number of triangles. This happens during Q3Map2 processing, so maps must be reprocessed for changes to take effect. The poorly named tessSize directive still works but has been deprecated in favour of q3map_tessSize for consistency.

+
+

Design Notes:

+

It can also be used on tessellating surfaces to make sure that tessellations are large and thus, less costly in terms of triangles created.

+
+ +

q3map_textureSize X Y

+

Deprecated. Useful when you don't specify an editor or light image for a shader. Recent builds of Q3Map2 will find some referenced image in a shader and use that as a fallback. Historically, this was used for surface splitting for RTCW for PS2, to accommodate the hardware's limited texture range precision.

+ +

q3map_traceLight

+

Obsolete! Surfaces using a shader with this option will always be lit with the original light algorithm. Patches will not cast shadows on this surface, unless the shader option q3map_patchShadows is also used.

+ +

q3map_vertexScale N.N

+

The light value, at the vertices of a surface using a shader with this option, is multiplied by the scale value. This is a way to lighten, or darken, a vertex_lit surface, in comparison to other lightmap_lit surfaces around it. Values must be normalized.

+ +

q3map_vertexShadows

+

Obsolete! (See q3map_noVertexShadows) By default, no shadows are cast on vertex_lit_surfaces (see surfaceparm pointlight). In addition, when running Quake III Arena in vertex light, no shadows are cast upon any surface at all, since shadows are part of the lightmap. When using this shader directive, shadows will be cast on surfaces that are vertex lit. However, sharp shadow edges won't be seen on the surfaces, since light values are only calculated at the vertices.

+ +

q3map_vlight

+

Obsolete!

+ + + \ No newline at end of file diff --git a/docs/shaderManual/q3map-surface-parameter-directives.html b/docs/shaderManual/q3map-surface-parameter-directives.html new file mode 100644 index 00000000..d2b36832 --- /dev/null +++ b/docs/shaderManual/q3map-surface-parameter-directives.html @@ -0,0 +1,198 @@ + + + + + + Q3Map2 Shader Manual + + + + + + + + + +

Q3Map Surface Parameter Directives

+

All surfaceparm keywords are preceded by the word surfaceparm as follows: surfaceparm fog or surfaceparm noimpact.

+

These keywords change the physical nature of the textures and the brushes that are marked with them. Changing any of these values will require the map to be re-compiled. These are global and affect the entire shader.

+

It should be noted that some of these surface parameters will change both the surface as well as the content of an object (surfaceparm water, for example). Shaders containing content altering surface parameters should usually be used on all sides of the object.

+

Many of these keywords are only used in "common" shaders (baseq3/scripts/common.shader), which are editor specific shaders used by the level designer. Such keywords are usually not used for the design of custom assets.

+

Originally, surfaceparm's were part of the previous chapter since they are actually Q3Map2 specific keywords. I've moved them into their own chapter for the sake of being easier to reference, since both this and the previous chapter were getting too long.

+ +

surfaceparm alphashadow

+

This keyword applied to a texture on a brush, patch or model will cause the lighting phase of the Q3Map2 process to use the texture's alpha channel as a mask for casting static shadows in the game world.

+
+

Design Notes:

+

Alphashadow does not work well with fine line detail on a texture. Fine lines may not cast acceptable shadows. It appears to work best with well-defined silhouettes and wider lines within the texture. Most of our tattered banners use this to cast tattered shadows.

+

With Q3Map2, it is possible to increase the resolution of the lightmap receiving the shadows at the cost to video memory. This can be achieved with the q3map_lightmapSampleSize keyword on the shadow receiving shader or by creating a func_group of the shadow receiving brushes and adding the _lightmapScale key with a floating-point value for the scale of the lightmap.

+
+ +

surfaceparm antiportal

+

Works like hint brushes in that it creates BSP nodes, but unlike hint, it blocks vis by not creating a portal at the split. This is designed to be used with large terrain maps to block visibility without having to resort to tricks like sky or caulk brushes penetrating the terrain and throwing ugly shadows.

+ +antiportal +

Players in part A of the map will not be able to see into part B and vice-versa. You can walk through the antiportal just fine. Note that this also blocks light. There are two caveats: They are opaque to light, and if aligned to another BSP cut (such as blocksize or the origin) they will not function correctly. Don't align it with anything else (like blocksize or another brush face) and it'll block vis. This keyword is found in "common/antiportal" so you shouldn't need to specify this. "common/antiportal" was added by ydnar, so if you're missing this shader, it is included with the latest version of Q3Map2.

+ +

surfaceparm areaportal

+

A brush marked with this keyword functions as an areaportal, a break in the BSP tree. It is typically placed on a very thin brush placed inside a door entity (but is not a part of that entity). The intent is to block the game from processing surface triangles located behind it when the door is closed. It is also used by the BSPC (bot area file creation compiler) in the same manner as a clusterportal. The brush must touch all the structural brushes surrounding the areaportal. This keyword is found in "common/areaportal" so you shouldn't need to specify this.

+ +

surfaceparm botclip

+

Blocks bot movement only. Other game world entities and human players can pass through a brush marked botclip. The intended use for this is to block the bot but not other players or projectiles. This keyword is found in "common/botclip" so you shouldn't need to specify this.

+
+

Design Notes:

+

Careful use of botclip in a map can greatly reduce the complexity of the .aas bot navigation file, resulting in "smarter", more efficient bots.

+
+ +

surfaceparm clusterportal

+

A brush marked with this keyword function creates a subdivision of the area file (.aas) used by the bots for navigation. It is typically placed in locations that are natural breaks in a map, such as entrances to halls, doors, tunnels, etc. The intent is keep the bot from having to process the entire map at once. As with the the areaportal parameter, the affected brush must touch all the structural brushes surrounding the clusterportal. This keyword is found in "common/clusterportal" so you shouldn't need to specify this.

+ +

surfaceparm detail

+

This surface attribute causes a brush to be ignored by the Q3Map2 process for generating possible break-points in the BSP tree. Generally speaking, detail brushes are usually set in the editor, so you shouldn't need to specify this.

+ +

surfaceparm donotenter

+

Read as "do not enter". Like clusterportal, this is a bot-only property. A brush marked with donotenter will not affect non-bot players, but bots will not enter it. It should be used only when bots appear to have difficulty navigating around some map features. This does not physically stop the bot from entering a region (as with botclip). Bots will not enter the area on their own but may, for example, be blasted into the region with a rocket launcher. This keyword is found in "common/donotenter" so you shouldn't need to specify this.

+
+

Design Notes:

+

donotenter can be (sparingly) used in space maps around the void or around lava/slime in certain places where bots have an overwhelming tendancy to commit suicide (lemming style).

+
+ +

surfaceparm dust

+

If a player lands on a surface that uses a shader with this parameter, a puff of dust will appear at the player's feet. Note that the worldspawn entity must contain the "enabledust" key with a set value of "1".

+ +

surfaceparm flesh

+

This will cue different sounds (in a similar manner to metalsteps) and cause blood to appear instead of bullet impact flashes. Actually, the code for this was never fully implemented by id Software. It remains half-finished so unfortunately it doesn't work.

+ +

surfaceparm fog

+

fog defines the brush as being a "fog" brush. This is a Q3Map2 function that chops and identifies all geometry inside the brush. The general shader keyword fogparms must also be specified to tell how to draw the fog.

+ +

surfaceparm hint

+

When Q3Map2 calculates the vis data, it tries to place portals in places in the map in an attempt to limit the potential viewable set (PVS). Brushes marked by a hint shader are used to manually place portals to force a break in the PVS. This keyword is found in "common/hint" so you shouldn't need to specify this.

+ +

surfaceparm ladder

+

Supposedly used to allow the player to climb vertically. This is not functional in Quake III Arena.

+ +

surfaceparm lava

+

Assigns to the texture the game properties set for lava. This affects both the surface and the content of a brush.

+ +

surfaceparm lightfilter

+

Causes the Q3Map2 light stage to use the texture's RGB and alpha channels to generate colored alpha shadows in the lightmap. For example, this can be used to create the colored light effect cast by stained glass windows. This can be used with surfaceparm alphashadow.

+ +

surfaceparm lightgrid

+

The min/max bounds of brushes with this shader in a map will define the bounds of the map's lightgrid (model lighting). Make it as small as possible around player space to minimize bsp size and compile time. This keyword is found in "common/lightgrid" so you shouldn't need to specify this. "common/lightgrid" was added by ydnar, so if you're missing this shader, it is included with the latest version of Q3Map2.

+ +

surfaceparm metalsteps

+

The player sounds as if he is walking on clanging metal steps or gratings. Other than specifying flesh (doesn't work), metalsteps, nosteps, or default (i.e. specify nothing) it is currently not possible for a designer to create or assign a specific sound routine to a texture. Note: If no sound is set for a texture, then the default footsteps sound routines are heard.

+ +

surfaceparm monsterclip

+

Blocks monster movement. Not functional in Quake III Arena.

+ +

surfaceparm nodamage

+

The player takes no fall damage if he lands onto a texture with this surfaceparm. This keyword is found in "common/cushion" but you may want to specify this on certain shaders (jump pads, for example).

+ +

surfaceparm nodlight

+

Read as "No Dee-Light". A texture containing this parameter will not be affected or lit by dynamic lights, such as weapon effects. An example in Quake III Arena would be solid lava.

+ +

surfaceparm nodraw

+

A texture marked with nodraw will not visually appear in the game world. Most often used for triggers, clip brushes, origin brushes, shaders with cull none or cull disable and so on. This keyword is found in "common/nodraw" so you shouldn't need to specify this.

+ +

surfaceparm nodrop

+

When a player dies inside a volume (brush) marked nodrop, no weapon is dropped. The intend use is for "Pits of Death." Have a kill trigger inside a nodrop volume, and when the players die here, they won't drop their weapons. The intent is to prevent unnecessary polygon pileups on the floors of pits. This keyword is found in "common/nodrop" but you may want to specify this on certain shaders (fog volumes in pits, for example).

+ +

surfaceparm noimpact

+

World entities will not impact on this texture. No explosions occur when projectiles strike this surface and no marks will be left on it. Sky textures are usually marked with this texture so those projectiles will not hit the sky and leave marks.

+ +

surfaceparm nomarks

+

Projectiles will explode upon contact with this surface, but will not leave marks. Blood will also not mark this surface. This is useful to keep lights from being temporarily obscured by battle damage.

+
+

Design Notes:

+

Use this on any surface with a deformVertexes keyword. Otherwise, the marks will appear on the unmodified surface location of the texture with the surface wriggles and squirms through the marks.

+
+ +

surfaceparm nolightmap

+

This texture does not have a lightmap phase. It is not affected by the ambient lighting of the world around it. It does not require the addition of an rgbGen identity keyword in that stage.

+ +

surfaceparm nosteps

+

The player makes no sound when walking on this texture.

+ +

surfaceparm nonsolid

+

This attribute indicates a brush, which does not block the movement of entities in the game world. It applied to triggers, hint brushes and similar brushes. This affects the content of a brush.

+ +

surfaceparm origin

+

Used on the "origin" texture. Rotating entities need to contain an origin brush in their construction. The brush must be rectangular (or square). The origin point is the exact center of the origin brush. This keyword is found in "common/origin" so you shouldn't need to specify this.

+ + +

surfaceparm playerclip

+

Blocks player movement through a nonsolid texture. Other game world entities can pass through a brush marked playerclip. The intended use for this is to block the player but not block projectiles like rockets. This keyword is found in "common/clip" so you shouldn't need to specify this.

+
+

Design Notes:

+

playerclip is often useful for "smoothing" out the geometry of the map, preventing the player from snagging on objects. It is also used in open sky areas of maps, preventing the player from flying too high and seeing the "Hall of Mirrors" effect at the bottom of the cloud layer.

+
+ +

surfaceparm pointlight

+

Surfaces using a shader with this parameter will always be vertex lit. This option can be used to reduce the lightmap data. It is often used on surfaces that don't need shadows. Basically the same as surfaceparm nolightmap.

+ +

surfaceparm skip

+

Works just like Quake II skip texture. Use on sides of hint and antiportal brushes where you don't want BSP splits. This keyword is found in "common/skip" so you shouldn't need to specify this. "common/skip" was added by ydnar, so if you're missing this shader, it is included with the latest version of Q3Map2.

+ +

surfaceparm sky

+

This flags the compiler, telling it that this surface should be rendered as sky.

+ +

surfaceparm slick

+

This surfaceparm included in a texture should give it zero friction and air type of acceleration, while standing on it. This keyword is found in "common/slick" but you may want to specify this on certain shaders (ice, for example).

+ +

surfaceparm slime

+

Assigns to the texture the game properties for slime. This affects both the surface and the content of a brush.

+ +

surfaceparm structural

+

This surface attribute causes a brush to be seen by the Q3Map2 process as a possible break-point in a BSP tree. It is used as a part of the shader for the "hint" texture. Generally speaking, any opaque texture not marked as "detail" is, by default, structural, so you shouldn't need to specify this.

+ +

surfaceparm trans

+

Tells Q3Map2 that pre-computed visibility should not be blocked by this surface. Generally, any shaders that have blendfunc's should be marked as surfaceparm trans.

+ +

surfaceparm water

+

Assigns to the texture the game properties for water. This affects both the surface and the content of a brush.

+ + + + + \ No newline at end of file diff --git a/docs/shaderManual/q3map2.gif b/docs/shaderManual/q3map2.gif new file mode 100644 index 0000000000000000000000000000000000000000..b0fece943f09f1c3f73b9de80dc9d3eb40aaef77 GIT binary patch literal 318 zcmV-E0m1%9Nk%w1VORhl0FnOy{{R60|NqR)%m4rYEC2ui09XJZ00092l#i*)?GIm= zwAzca-n?hyh2ltZV2P$GcCPL#w!uKx_5|bru21$q@C7Y2m`P9p-U7NEvo})~qnD}i zgTz=V&8~9_9&UwKjVw8=c$;LZd+aV>&J_3>8g5JB@&LW9cK0PlC?wT4msOQ!;f1Eh z2#A=N!S}>gR~VN$iG_C9==As&x!Fk}vsaq42-$jS@drEWNo%{2x@V}g3)K7byQJEY z3pyNStc%RM?0Yl{t)-b~O8Qz^O36u-y-iI$3TG)<>q?qzeypyHt7v`B{7sll&)gnO z&Yi9q-kl$k>zcHE`M?cCQLF|ebnnFRlLqQuCSmj9O?zk#TSPM#?rwQR)$yZ8St4hV QEO{z|%9Sizsw@BiJ31toqW}N^ literal 0 HcmV?d00001 diff --git a/docs/shaderManual/qer_alphafunc.jpg b/docs/shaderManual/qer_alphafunc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e80b4825ca73aff9b4fe2067f1d051365c069f86 GIT binary patch literal 54645 zcma&N1yEc~w>CPsySoN=cXxO9!QI_0xVsJ#+}(q_1qtpXz#xGj0fJoK_k8D^|Nd3C z>h{#s%yjqewR)}R+0)%??f3QfeE__dh^ zL0|wNF(9BYAl^p-jQ{{76vRK}L(_i?BoqJw8U_{~0q)=G|D)w&Dv(egP3Qnf2q;J> z7-*P}slfbmJtPKz0*W0|TpilnjS>qcER_Scq*(%+Yv|j7hQ$(T#T5!=aYQ{J9204AKKy<|8kiMIr*=P#o?Z}e(Nu<31Gbg&PM*OV7*>GalZU2c?V#9OrtcU zznCVZ@J{s5_3a+!9nc>_bM_9%KXrKrJn?_7J6S^hAXIi|>Mv`gh?ZFT(rrPbFzjmLZcPJ(q8RPxplnB)23 zns>nS|A>AE{G*9m@I9C6|5x9C8prtKZlk6XJ7%S<0xN1O=2Cl&qYv$L7uR_1>7Ne25#bL-@tYm%x@hpSzqxQJQ?>^4#@u2_&w4Tyqxt_7Ir+=Ck+?i2d;1%IN=L`489I z7XPxDDn1GN7bnW>qPu(Pq6-3K{{SmIr2i{TNYRIl{;@Cb2f{UST#Qd4j{WPXJ}}1Z z`e8=>0S&X+f#z>5mE*GNF=0Y4+C2DZA6VOf`UhPzfmFZv8g~vWa@9gU?AtkVUWjl7 zcD??fTtm+1SH~wdhY!$xFy!#)9iaVTzU2Gb<3noyH7Qve&3}we_kS5(Q>oVUgOlGe z2Rav1>yj!l-T^zx9994JN(}NSA$k1=-?=(_=ekofHy`8h?NyD6{?SxY`wwUKB%MP3 ze#|Y;O7b84PzJe_V3ps0R5axLgLzlgHxE!)_1}52-Rg=DT7GX#PoWPnIL+YOj=blK zKA81wG(69rcbvO-Xe2ZGIm6@la&n0E*7=fwOlExg;lGEbw|lDu)jz$*UvK9l{$*PO z>%WA#{SRR(X#Z~fwt3o=#R=l^lizli(SOCPZRU!H^hUwjEsd}|F%PaSkIzPm39(!scIhZ{J3ZU>`t-t19_Jvs2gl#R8KdMZlMuUX_+7;_vHDMkUytmFIU*QC#D?RNsXgD@BqZUfHH{t zVzminPy-#aR8``{4eIpH(EkJwlm&Q+Jcs|n5_`+3nr+x`0Wr7ft5@zE@=Vp& z%+GH-G$X@PU@2!Sjisbk9)zcTz(OZy->6|34<@=RLyxqf`+2K6tO)c|^(Jp~fRHf9 zSpN2hS>v@-#ig~}zGA2li<4DL`$#Go(pg&_av{r;}x)6QjrjBi>crb#0OG$Tazh{CN1J$rU8w^4qKX43ui zdsE8ru=_z%LWO74JV%fyhm&-(x#;t9wo#3C2lt@)uw77kvG<>mcp9I{CwIXgH}DZ` zew<;l+WwZZ*dZteaC=;BsnvSEkz$yhEip4OPZ<| zjLAtN^bskTQarCDF`tIGYzBW>Nbxvy!iRBItgeG%)yrvFMm)QEqzAyH&Fj!J?4*ex zM{o;-bDfBwl+(sz;7if&0U|8egrChBMMAvB$83`y*>^&Qr62{z2xTM z2AfzWM7hIGYs(ytGAuA^$10F&Y;$C-7G0RF4}o|m=SK_NK?{i;F^h&R(J@}WErOO~ z2@JqTO~SL?pGt)0RU@!|U;<4n^uSLWlZ0Y8ypRzsN1I5N0B2NeAnCl9GNh#d1w`cM zO168t=ugHx*imnozUn!-yf|xDeeZzP-zMerL6v91RGqs|C)rc}MFr3DqBljU zv;$pzHWa;Vn3i-x-Fft(gO{b+Wbp=7UAU>7{*(rCi|*JkP#fZ6NbsEu40EHddEuEp zD&gEE6?B9tqQW}57QoM_TDG=z_^N`^IDdXkJ>|2?M0F!B!@Qh7G8K+T?5~2MGu+6r z4uq20=e`M1vR8ld8V#|LK=aOoH7P^YsCf**T2?#|t@~=nFdZ?GO)90-^$zG+I5gdG zyJ6N*V`{>JsStbzC~N6iaEXAU)4$&p0beiO8TJ!b+ z3L)j6bO7toD<9fC`NurDPINk+u9$8tBQHn*x)z+g_UM#X*-x4tkw z{th)HHA-+E6Dw`n0-rqH$fZ4gpyax(nh{z}toE><*Hbff0Oh#->9Shl`KtKKR6Hzk z-PQVbmZuoXsF<~IMn;_o%51fu*5D47vzwts%oHp`ONqLUJY26q={=_uyhGA+qNF5_ zUFrsJ91QzuhGoi=JjOml_654KOjXl8U(>u0{=g!OvtEGVS8-h|OI|o591?#fC#UY$Tq&#>Y|+8{OBf z21!(7p&)YBlv=U}35F154r@yuh0Hjjd?XAK^T}r1XjJ*`nPE<0hAsR@=r?Vr3!$2l zgnYFQY5bhf0agsgb*^+xZ88pG3Nfd02-G1l;sdWMP)Ral2pYz9GmTpeMoE?veFdeN zJpM?eBnNS}Ih+P=o>_!BbWPXqHT@`>02sD4hi}dI#=O$2$7gDy>MKWoi^vd^%eY%w z(#b5Aw@ixRjOGQw?|{aw;-k0P*9F!12ELm=PH!Rdv#%kmA-yj~jhc50T|kL3T^dvP z5$~YdTHGH3xaH2 zv;;J<4!{2ARh!eG>zDaSt?Z)Evixtkw2%T0E#O~2eFPNX!HC|)x?FCp_2 z0AYP0x_QTLKe-$`r8Nm4kD-b&7pk!n#^0+PuTNpkyGSgLq+|-l&@^V7B{5ZShao`~ z9`{C>y&Rx0YX!I{NxD9RgEoNHJcgFzRSw+8E`n#sJH;Z`|7J1E*vGEQ}m zM#2?^;a5g6v~0q#A*)2K@ucjE@h|QPKh@)*ap@)S z0kxqr!&~+tBxd;ff3#QC0F=l|V_FIt#h4-^oMbY@GqhbnzGm3@h2;jeZ4z^LYFH;w zbSTZ8V%;3f^Pu(Vx>%?wnS*cls? z!&EBl+H{fEH8HA$;Ztb=_OSx89U$E1()idSZH-8COmdiTUk?zi2G0%bST~`)iGqxV zI0Ne5=RGdr$Y4sjv^C)DH-%YeI#yh!?iT2AUjCduh)q>1g{HNke5j|08ELqYwgvM) ze^$PySB@-y)gr30nXI?jFhhf&RA#>8T&=7k!6lB%(UyTmc6TOPKemOWQ4Nx}-zR=O zOEI6wTt4^E$B%agb5O zmdlEG`OB@1Dx7IK%~eD&JFnsCrQ=#`TaoloW9c+;Fl{($d(7&qt^D|A#^UO3WBI?; zxUbEvh+G>^qo!a=m#N!O7+Az$UCTvwK#)Sxu|fw<;@|EXWk*&lrdI9;?8(V3MyYUr z#O}J2ODfhm4{E}}>tk*ACImvcMBJgzK*fo9v#28lw=B{~r2s?S5#5xu%7+j&o zuedQ-{q0Z!PY-ca@B})J`j(7+k#!0}eOsP7xC4h2KTeSK{&itZZag^=9S;e-3lY6H zX@B1B|J@P4FFwg!8$W};sPY?TXjAaCUIP*W54WniXM2vo00*V+VO1R=b_ZI|fcr!X zf(J@nTya6g3!;kp5-&epir0~4k(`i)iSE#%B%B-xs*x~nB~Gu4c9X7x-VQn^oOL|n zmrL4LnB*>9S?Z^?Ykk2)xFM>m9K7nW!s8$0HAj*yzHGp!+6=F{sW9ybginsypQOOD zNZ)TFVl8~aCPhO&1ZLwhRjvP)o5)&zZV61=3qBx zeRg{>O@vCVvr3FW>4(Mp#h%+TxRp^NEeg5qQ4Pb_-Jcq(MB? znWnBwq4jKkIOxDTwad@mKr7L5OqqIdo-~)3n6cOuqVE?vw1F4~Y+j)3k_~IO>w&a8 zFVN8z0;6g1DN|)9+Hz)p-E6@DP{%~yu@&8}J z7PfGdX3#$;>wcIy8A3hTYbVt8o>)@?x-}FX_J*TL5^SWz*lXG__M_ebU2*WRYO=Y6 zVt{lVsW!9qMXhU4cZx_}=}>#rX&7E=or79D(2GN`2DGxRJSPqHHI7QN(F^ctr)-^$ zWtrF>#JQaWrY}T-$jCwtg!Xmx)$w;o_ZZ-2Y)>)Y9(1~CPMtaLr?w@LVIxtQ0CQj@ zJX!1L#l~RWuP~!&=5s*`4HSM-tbyoC4`|-@s>N)(GY)pt$kBcW=%pWGiZUy$W{opl zc5?F5B`6Q9#dj&&r8gtzLghE1L)fO#BSwm+Q76)cSs+2KC9+rqL}9=!&wTEQV;dF2 z=xxIn0Yl6tOh(ouV?b}3BCF)5aR>U|nmYa~8#{L139d?w06OX=OUtpts%B0+7>hq!-Bm5}R>J2`YX zO;Gj@kXZB%)_w}9zF*LsINK2%5x^U7VSmbp{fRUW$Jg)GXn_wwhZsIl#@ z>ABa<#=?1{Vf=Ei_Nj->$gONOX@0GmE-o=}R@>o45+lv2d~Nysp|Sm1KCnoB?+0t+ zAKC5OpzJMQ>H$?+;b4vDcYrr$upNg!toY+J=p8VVoc>3(^JXJ>FP`=7pWky{d%}Us#U;VnWL1`D{&*0EU(QYl(Sv7S z)VCd`{)l$_^{uT@zXQgBCqXAy11_S^btk`n0%zy9{zB`<-Xf1CwRVZ8c|YW3D(!GX zr&rZXF00XQNMq2B!d4p8AQaE389erpZ{L=3v9Og5JMmVu$0skVyBS6nO^2_{{fzsB z0ZQ_OjdaFM7a&CI5B_&yVoaQVVmf4b#YF}~gPOQVqvYof)6AHv#+4fn%Rb%h(7{Tz z?>ZHMKgvdzV3w6}X!Bq{?oT_rxjia=EWV=CTqsd`?q05RYY=DRm=6G#`D8(Qkq7n3 z%KVa)Uj78nNb&s>nVN1`DS*h4MsD$zSd<%Guf-_@9XWco;y0R=7TZK2LQHS`fHtwH zfvlC)@?xh^Knsn$ky53HAOh{hrhGf3fQ#xU70DIzi3EhLu4Zy?G3++>J;Eb3s4Mx+ ztx$D=t1$NQRmwdH8Ta#ERIcd@v6RHrOT6g3uB4%f?_X7N1Ir@GVx=fxy}EE&Q!e0pHf)le)H9CG!V0=)3<8mwR57|1adFNz-T`3=mRs%dmY*JCV~@#~ zl?=-mGyRbHv=g*)#-}~aVXNtiD~0LCc@t{D_&bSlX-m-&@)=0?}2&n!^UHpH>KlY&i2}L#E;)gOmRY3b*r-VFDhG#BNnD1?@rtzH=fWZ#~R7hXI*6u9js%U+SX6}*fYH&j>!FU`5IqlqV(PP4)1 zUCaA>&8<**_DmZdEYO$hZGmhF)vlM7WSMMbB(rT&e6HVg8=`WvIhbKLlh^9iHjLUI`7^77I&o=pWPG_2|Iq=T<~I~<#hOwtiD4K z^N;zSpNtK#kxiTaA^_12fBGyMv&d$-unf`4KEB1%nKnTXG2%I^(+ys5k*U-PFukHT zo*~w=K$(G0+q>my&!T1`4jqtD#lOz#Lp@xTXgTlnKJ3Y*u^Fhd0r6(DsSfi(%*NH_ zbm-*@{5`Fr4zP_zVX}=!0TglR|5ar{j@L&aWA}gM+)__2L3!TUhDmh^8D}ZPH^DQb2kwmt8t9n za=<7;ekcr(glli$#K^3a*f;MDhfU8r2{t;1*y{IWB#YVS)b_8ch=!>N_nb9DD|g)@ zmn$^0AeS*%aX2+Jmo?3zFAs)n8Iw%YCE>~FKPyIc(#4b5J9ok|u(Hd97GLy!J+~7^ ztNcLbCR1hC#)Xe3z#xAhjG;kGhkz9QOdSq%ch4o%s-GS=M0zw{g>7m%*}%A8##0%K zFQHI$;n!}nh6kZA(O75v;r@M>v!2X~iHqx<7M!lBd)QE1H}@yQ>skhDage{;Hf@gWu^Qzon_UT#uv(3)xhEsAt z^PfZp(A(p>4K6f=o-w+U;ohjUk#Y)iI#m=uwlgFW6sL^S3Uw;9w3dwZCLGL36%M2Os=ZY@bQ+Im$(T!$~m#!z|>0{e^37JWUfJ6Y=4E~K(VAM!+8XVNXSz~tbEC*& zX2lfbnnCu_-4e8kr8>@IN4;TK>a1JjMsk{<`+S2KdB@b6a9-GJ6l!JgL9HqsJE`q( zJs<_)Q#*i^t6XVesURv-@r1oKXneib>E({Wl5Ra5D47V6Wl5y#T=C)}{zb}cqDjn( znibt95i>VTsV%IB7wV2k$9_x%!Ge<6ZEN1HI^kDjG<7xfnW2?J%95{9(mWSVcGYkl z9s!Hb{5H8Qe{;J2gfbm59K}u|Mn*9fR%)nl!D$}t?-@?PZp1+NZwX{x;MiCUtKTs2 zy{efB5M8iobrTn;cVU5K%y%RK=J%o+bKsmCte>mQ?|{xC_mGFqH)PW4^Da)$`lV-^%EpR2 zrnTV>A`u|KxDYf&sf0LS`n7Z9m6X5W@$IW&h(VF*w$pWpWRl;}L~n4%Tlg?0&LC@|}xE%sX!2Oj1w-nhh*=f+GSmADM!N zJEjBwb2v*jVD9+EUx^A|)W+7~hCDy+1blwVQVUo0642KNz_;5(JE>-4tQbn5>M$wc zNp(Y&7h=VYtG3R~e9m&DU$OSa7vfu;y(9(*jDhDZJ=!?%C}@TfC!Ey!s%G=m#-)Mj zmCpLGpa*VjJ@*DBhfFEB!bvY=5ejLU_^Q6g6jF;HLG5(bfv<>u1OnQY(_$u-6|Qo$ z64T0{WG|b-=lWp}Pv4svOe74yh(=(wsb<-`>-lmIl}yDztC`?537Y1$g_2+l92f9lH#c%5 zPW%gR#s!^R(Ker-&093#-WZb(@Hi08NJnzg&4LC%rh;(P>`R?(dMb+1GsB?IvdtzDR;xWRhcjvS{v2l(T z&`rcK`73S1SLI`+-$oG;ZxMv|wi1oFtztuB@LKh=@ zu3~PkUnv{}ON&Jh&wN=cW?*8a5DaPyABEa`szIWob|toNGtnW+l%=QLlFJ0#5JAdy z96{R2VF&ig2>EEzT9eD~T(#rqHCgH^@lpqEHF8Ol06u3D;h;EOlIczv%x zyj2TD?J4pcTjYnHx{esG(cm!r5I_Ta6cRIb3S`Y1Ft;(D{))id8~}*3PsYyP{KTHx zof}9KfUsr|AMbUxN7=y*1B#|Jy4t7ST-7+LKI;I0#AkM(F}X%n;qIEF%v`xlL}N?l z)8qq&UED)ZWzx+%pyj2zAec1&#du&jpZWJ*HfOP^s`48vC)ikpv~jg3VTV>lAdtVM zAV)w;(CvsA7mmoZqi;av3wVP=Xh2cmlvjL6p`rkZ?P8vXw8x~wl?SuuY!#ictx zfv;+_Pr8ItLy^Q*1<8K;Rc*^H*y4LL2>M+S(bJ8+M?(jttVVcZAaEP#$3Bf!Eb&CxlT2HM) zS?gue?e^?Jx^Y)6Nh)+l)$;^IyZKwrxdVhF01-LlbBut-I)3Us^bUBhF@8XrVHgK!;V=7I|XX?aw~9?DTZ>@*=dHu;ep*T zmshon!ngN~_JzTuqNQyoVP>0{)Y22AGGT%;LcJ%>q@c)YUl!ArojGatk;`-&%`0Kjuhh2~_|qS>w$9bt~f_(b7`z#zE2zS0kT+WyhZ{fipZ9Vl#@=HCEPA+UDhq~P= z?s#RZawn(xc7lez@|Wy$kqRtI9%OuXDa)xeN97+{?4+ArGhf$2DhgREJdbF#!6AOr z;vK~1ScZYp`3e^2lm5Rd56%QKg!x5eqz^5laVhQfTDr^B)!0c1i6rj`YrN+I7@$(WsB1%0Wg{d_hvmb+ z7GatNx!ZPOCXo3P#25OFS1^EqGQ>59Xk()urKB`er={@t%@5xcXO`(T)TPK;M@gr( zt@L+k^+1%7xqV~O^fzQ2FEyhz7NLpLUo8Gsz&TY(2CmL}1DU#_PK=`ZE z*wZboDC5BH*7MezqbR%8xoN$lu&!b1O=WCP2=61``Zl??HFOd%F^F}iumApMYr}x) z^~pPc?BM=oC&c&npS_~_-lvd};+K%mYq#!kN5dD+HFDQ6SmT==nYU!0zE<3YXo5on z^$^X|gtk+{Um!Rp))_VPOv=72z0}7XlLaoMTS6`hHFrpD7tS4sTDS9AJe=PJ;mJqv zNS^Jm&_KuP66I8sdGMO$9vP$)v@Hmhf-&3scuzS>k)P+Yn|>Ev)=p z$hYLBI;U|#3L7sP97yPS|M_yQ16apU(~9X6Ip-Ivh(h91tlOSmVNCBU7hSi6_IcZiuVlG3)Yad$dLKc$~T5DVu(QK&`K#ctXNy$4d* zur!F=a1l&2LPi^Pu)c@ophpLLES`PEI^2C2RI-x|;hLxbJ9Oo)Ar%jI%eKV#;TI&%v(C#~12tbB4Zh@Kz(mo=Tb5FbiZLmwyLjfDS2Y0RB5`MPX3DCv zF7QjwOs-cPmZ%>#vC zk=*4&=Hzn6ZsgF}t=s^7JGhoCP3`ombIzk%>_){fOGg;Ds*AAk3YPIezh{-yHG1&4 z7u91*8490y=HDor8oUH2< z?94tA3(S!)eDh)&u_(xW@)DukM2ibQa(|A7Lz}701xv)@Q;F@l2cpc+;0kI8u-v+V z&49JhHEv~}XV&zazQ|R>`SUEW?^hr6MDkcKrt@A3 zytJ7@Zu?fE*r;P}p^fkKc~^HR_;_$-7GL139@g=#e(_E^pT_$Zql5G#c@IFa5p%5% z2v@F_rK)_2AeilHtu;T*9pT4FJ@DKX;@l!!dBVTEd(~lSot^l0PoEm7@^>Un)42Bf zl5`%gmhO6>c`d1T<<<*ozeC6yYB<7H1Rdr+Z|sjV|2fm~UpO!Hh1yJYv0XncRPxZ2 z;14A*W~59&R8O;sB5ed2ji2b3sxg-7M=b7Su~u3^KDG)1Q!+~hhrRrJ*wMrPALfgS zc*9L~;)=2@Y{1NV^m}+sF74oHRfs9+tt$xvw2E6SeunB+4lTDPm26S65#1cY*{04G zS5)N6Z7sS$V9|(yRDOnu-o@1>3iB}SNb(sWL^fqiV^ibo6B#Zm>F(S*dU@*v`lumT z$ZqzT(AVwSc~jZ33;Av(YUv+4PJ0oba)xTZltbbd6!Hndzun^fz)@Qq3>`j-`AJtH z<((7=hO^$whwLnHOHd06Jz6#}FRtnDbpicy?GY0Pq}95R z)YQ_dMl}`>45|VwEWkv{9Y>!zzB`L^)0WkRB*2!%OqGNVi8y!Pw#H2SYoE4Q1Tg~= zG7aTJsGuzprGXt10tcGa$0@M1R>hH-SCw6MEaC4`@RHZQZPd^421O)GV!sD9N+t-r zpTV(lT-4AW>`$WH7(_(zv2c1Ev!pHou_P_ju`qf=vR?W{0bGcp-oZJcZc7EBUzmS|S@)v^a*gE{6opM`M2}_tG zsr+)L6s2O=f?BnTLX8-YBl!tN(^Rr}7q!Z3JZ(iJpe3kg;6D2u$>Yfx`AN~E&syUd zdH}WYGKnBBNqL>guSj1R0&1QEZRQB@ojj;REhBKhIvFbxhB=jAFTJ)|!bJ7Lw!7jU z)&2dYulGejK5VR=+ygYM7E=at9($$QgmdZ;=Ni zuL?2DSm-y(p6yt(YLLh<5xLQa3lJa;DBXNl=~Z=dHnyG>ES+}s@K*`v=OyJD%NIt4W?&>o2s3kO+-}mmeI8gp|Y4++5{HDSRg1TmVRCBiGl9~*8 zb1vL*7!18TSh{*+9>9LH2q{#dqK-@o`5ADyGzLRjom0qqJbVaX5Yzh+i&twxR3!VX z4;tV2Z9T2LMrdc3_nju*YzqT;-6X`o;DneK`4I7iYm7!(LkIa5$E$!1+T0cG7!)(g z7hlB#eN(~mRqVfFtN)wy1^3sW>k+6L9~YQeg@bo5-7~8u!X8Km9p!J zRr0;Y?v>-`d|W;PVj%KNk8p)ZUYrN=39=VcV$-w}1sY|qmRk5kHjzNZbvdLKK(Ebp z;M=e2#K0urH*?ns#-AQX+9?o8_N^Lrdf#qyIHMBCLy(eX*suiUq~&lH2F;%H0r#b@iZ@ zRfWY9FpQ4mqoICP7VdWt_M+`J4pCh3tYf#<^9EGoVfqHtG-NOT*d_KYVovv$qSINO!#vbEXcLzXY`=ps0^GW<)|2$~q=VaEe)p$Iuu4$O*=CD4q#Qb1PR*L@UhAfUBPl`lG)@RSrV;R+6 zthIvLKb3mZKLumfQLoimhh+rE7+vsN&@80 z!9MHh~BGe21<2jDGEf#Z4VN zAxocK1yvN!vpvY0y=^O&n+=oP7=$jUH%M})4wK*1-F=|0HHBO*M^@u(KbCK^$BqlY16jOTeZ#j|axl9}N zh}uAu0!wYi-a{3PzclSwr9^bp4cwc2q}=-O$oTAB+FL%yHFM5)yPsJNCP<0>I4rTQ z=>wzyVwb!$l;!771DsB7zvlSC9``iWvP1f6Sbk);WTM$l&B75DOmjX=FSQ0g1=aIWZ;z0ks-kmCuWYbR79l2$N_ZNHlE2YEu}Gpls7!f zvu-#tDYT=_8`!Yu*N?pp%;HbFxDQ%O!#zm_sol`%T(9=c>8p+_&`!)eeK&XqZpz6<8keuapCIy;mwnAABrP96 zE$E&sa~7}0rckMLvts);BB`xYe(rZ9C5US?esCiQbQ{I*q#~wAB5J)a6g7OawoE8x+7ZCHt?^k59K+Or6D094rr>nsUOrtD@Xd? zCRe^$Iw7@5iIHg&nv%_^=?T>!ZhL~7r=^Og#4Rs5Sofr?!5qYkF=G7kl-le8ZkvuSnz|U1i}8uF40RD>W(eANNgkRw z4*4E6r@Y37n!l>!8y7|YD~nQ>>%X%op+sxCTzV3^dN>fq+3D28*A9=2n%DGtQooyT zC0Bvb;@4N$*O7>?e#ESd>q$g)Q*T;5A6*ZEd}NlP zqW`3FjV|>RRNBpC^FyaJ)#=6lK~z!H)1@rq8;beK^u=(tznvrAz^d$vN;5z*%FSZB zrM`{YC#Xg{LOczXHksWLghdVICIrUsE0W_IKHlYsuSS1dcQv2sC~s5iD3xAaxq%(k zN!7bauwU<-u>c&=ULH81`4bUBZp~b}UcPccDqKZl4Q1zmn1Tye*_rzx9TKN{S()Sg zv)VtEI44)g(&^{CNKr=8Zdz_uG;le3PdPHwsK!~M_eb47Alju0Rc&W&S0F6ew?+x1 z*8NdOJ~J&JKcUqQy@$|oJKA+Cv3my`Gw|XhA<721#MAbzH0)LQXKSz6OhmA#FZ=6n zFD#i!O~e2K4b!G)N0di%8;Vytmruv6!6IgNATpfx@oIx4n-wa5!PLOd0qN(H``Aml1-+X?LZ^+)6mv7t;9Qu-F|J#?O=5#MQv9)wBNkaPUV8{ zwRaI&F8|P&^MDz7#9LNilYD+18AYM!ZiwCP~_+|ibR1HYn zrZupQ)0YwxdeSl$Yp?`8`)cFrGNechy{3Ob=Vc}r@A`8trgm+GpqB+L2laapq#~s$ z2%*8E^+%=+QboEArwzBOAKEBaXEcqw86+x57p>d1?=q1HI|fdtBmBIW1M(`hKFZYk zMx5kUgDYZ?rfxZ${*awoMYhCZ^rQ)(?~l>;HVgeT7o}wE6>?3Y5Y6v#q^n1Po~DP3 zWSz8Q!RQg~qT(~>`|-3@qe$Vhpp}scQ*J@{SYk&C0+b_R7L#ic62x@rVs1^e`LH{8 z8wM8@D6SR}COW(fNCUI~poNsajZzga=)HaB3qn^i+|bhF4ED~84(;it?{#Lkp%!;O z^i`LMsT(jrfD+s3U(MGM??9>DH-i?}aHbb9oS~w}#Fq-F9O!KD0#J(T1qz+o#f&y_ z_#h#@`On#LQi8P_Ih3YOssRb`C??$-a4D$>qQ81B z3{8L}4F#-bY!R9F6?g>PAkZ>`5@DILljbJVNyNWw)pgFZ&V6TqP z>ZRjD5i&pqPabJ3qwuw$`_MyVshsOqaG$`|a`knGcLl!6{E4w}*=d6y_gOI#x>MQ_ z&5Ptjnt&7)R(62;TuxNU`uhKHbrxPxHEg?|p=;LBx0t=e+OpowdIIV6V0JUUyvA^}EY2^If<#t*T6L5{TM# z#IhYxHiv_l3O{d0A<_-l%*)Z51n?O(*H(UhuCBi$8-oM5cj&FIQx=HVds~lO@)Q1m zvcPF}23(Sk&kDVb^CkZ6;Yav+M6>sa-Imc4(y^@aiHWB}Hnlj=13LX#Ax?zPAK}pN z05xhY0F7U*0j*D@FnXH74lqKem8;FnN+hL!4D<@cBXHLUppr%4tW^CD4s*@zdcvcY z5NbVPTg&)mJ0(Slp?Bnb}oPox+n1ren>Ge?Q@N9Bs2w@OJijqtGEH*&iO5M0B` z-sixqUgOF99}Ai4819j%98VYTJ?JJ-Eo< zQ1lc_O3wEo!x=JMq!N3G8jVY)^WUw>PoRdP$Zlo>Y=6*5e{toDrb{gF!EqK?)!I?c z2XfGO@C{-Z1hXRSLNVGBlR+_FLisI(qc9#%oZ(}wCj`CtB0MxD+jQ={GR)t^Cuvhd z4E$D+qi@y213L+A+yv#-V~#MDPW?4IM!0eEdducn1x%Y+Cgwxd6Z0IeKavV=6l3-F zOP*;$m>g3rP6|cL>L0IAA+r&$3i1j}%*Q?z^M;YKdpDdBUp0Pic?PDK4$zkKZLu{8 znL3wvPos!{+s-!KJu|m`9;;I}F%22TsoHTB5cdxSGH+qV&)n6e0Fdp#|Le>PR8FZ@ z1Eo}u=&c`-?}Wza1xOb&PAw!dUg68djrB)mgfWDxihbj*0|W;>+2u004B-q8-^K}= z5zMIJxOZvgNsc6Lt+oQcFD@`kQ*S5OPh|}^6PoNm&7^2YhcZ|o#zQf@>n!L`TXAu; z3nV;=Nj?0G8??EfUN3yr_O8T8I@mLl30`o6>|(lF^R;P@c-H9yJ3e=&kRPz?5WEg1 zrzgYXei`ibX8Lb_bln5)^s>O#u~n{cv%kCZO>$JPdoC_nv)i!G|1f8V!g3agGm@4W z$Ev28^@75+Xf&DL1cVwnGPb|RJH@ZKDvs6zx4NSAi|j2Cs0=@v!34koy16XIg`>D+ zVV)8o_IiB?mQ?lyuvE`0a93o&O_JzKR7ge%yu6RLO&{$x`x@i9D@wXW-uHk>yi9i?L_q9%d2a-^Uk&zGyU z!4HFxl8#`o1vkfP{Nf(WBRTQOw5no3gs+4=XWGWu*ITkMZ^!G#cEaXuPfMTpGtrx& zxokw`IUl<}6C?0v{dB~6l+>;g#on-GCFMgjsPn-w41m-pw^Vg+wlq!c%4alJ5QyXr z(s9%Otfsf9hNLeM*r${=P%%-P#cjg9hQp*U*w$)d9b;=E@tzifh?D(|$$(4WU5Twr zUe#>lEy6_g(sH~xG~~0f>&!&ic=-T1E;T)pgc7;-F9!I}C`i3|ys^36KQCEc5GTz- zhK&f+-vN}`9(yW^q-DXYzhaVe^k&Oy)_uE!XDrZFWNaExfl{&dg&PC<5Zg>7IbVrc zbSy_rQUgO@5%{bZfADYTaaJGsv5O0mkc@|RWg85vy7r2a1Fmr7N!tplSWjx(~; z4w3`%_E0BX)Ze?usPlu#N@MlartL7v?vX;%uY~_gApWeu6f!#Mw>v;MZ2yk@bM~EE zK@C4w=(bViv#A9;h2hwzpfAAXUM#}lAHako=La(VXDj$Pcc%;($%CUVzVSQ>dby%i zoUfCFBkg-S+HT%eM^{;iLBC&{8e}*#qpms|&+e5U>OCigmM_n|TCp-OkK7Q$^A~nx zk^FkGud!i#)S($Tl}JTpS76RVtJq}RGPE`u8zX?tALkQH_^aXozYEGHkg|!Qw`|ub zE9305ld&Z>M0S{_H7)`_#(`H^`Be?rIlvlGCGaLV*k?Gk-suasIxE&oja~a&8k28` z&B=TIQy@q37z3>i7>7w*oGd<-Tw08YU+eSz>lUuOW)*TA{2M4uQqiYd8matAz#{Lg z+#rQqH-(-vr+Soun?O#XV(#!0bhmzfTw(UKc=3Y;_lR6<;>!X*! z$B6v5c0Nfqe!Eb73wPWddA79&uTN8(nULwA0Y%rA*%_z7yd37~%!3hnjzgD9wBPq& z_0ZfURV&T?(R@1-3f-|}W?}m<+>`jJT5iv`1;)-(>*(C|!EiZo0m{$~9W&}BzqEXn zjbt$5M$Z5>D6YxlX_1T&8GIgnq{8@g(N4#Vp)-yH*TXfI3sx{AGlX*)G-FJZSMsFf zDRnrNuNNJNc;h_iKKE^_hKP$GPNEH5#JjcdSg>Q^d0&IA9AE!@TeiH9U^t*r7AZkS z(Lwwr9smGZg`*L%$QTKNSp=1@xYXFIuXw3Weh-VHrW(GV2!O2%|TT9g4 zb))UG{&-qlqi|mMW3Z=K4!nXxeHFD8IPIQclb)bb7FCe?jvf;>tvp0jD8a?s{9x6j zBI*?=$9V?1;LNIPznQ|8ODrE@oVHm>V8Y=U7hbWk2;Uwy>jxJKl~<=w@9HyH^Bn0A zluQ5s=Xb97l*4FGtq#Q~ytveOd*Y%y;qVKJ6!lj4k)RWJI6?f7JwIAvZ*tO%TFW9k zfoc^2Y|{n;3S~(?z&0j^f_PX(pD)zdX@E|MZ{%zW+`4hK26QMzV{tgx4yK?a@sw zXpBafi8-ieu1OgUplM-b8f+V{LiY#Gk7$W@eZJ4WG^D$#?a*MXngQVbYWzL}mKHth zia@@VBOy9VcLnomFb-}jK*bvfrsfBAcJgiVS{_PiH+7J}>v=!&4^4lBnn*dH4~PXUt#Qpi_kk z0Ycu_a~L)B5rG%&DJP%Eg_p7;zG`;c zL;^Ony?G4m)oggim|-P~ACuEL*jtHfl<4mUoA(r|Pl0|Pv5epl^Nf096=WWcf>4AB zWOcMG1(nBtNQVdZIk;rwX~Js0=2<3lv#tp;$cORy$p_x(G~A}*|R$GSCF zyodOd0>GV#eI6+E@sBuyL$`Hb(suteaRYk5sdr6p-w z-N8<%Q)Zw+2D5hrs1qb4kV@S$*B#?PYiM(`VO>%QpzPN!XmkLFPg*37K_(&zLWVf) zM>zc*4-g5aiLa0bo`gm^w8oHRi3|M&okI?()}p&?DWRK(X)JL|<(jv7YBhL)%+?KW zY;6kH-H8tnbQur5L!Ocph~4oQ;u5$=Fr2309oi0-9SOau;otc}u~*f=je6hO5z&nd zbM2anC;zZxMDsyaTg%)hfMcKS*)T`+?xxYs*83k@|E*@}|Jt3VxE&A106KC6o*$qHI>hF%Y3A&sYfqP-`1w3XQUs(b*(=aXQ%=0X(9a3`1YfQNojM5|*t{Px;K+ZDfDU1O@;tt99jCX(xTAUz#F z;@dbo#ScCbz|Ee-=qlZ?9i=w_${)~i>%iJvG8nwGEW|g7cND_P)%Y11izoWB2~I3; z^x_m|d*j7}@LAQg+xOGB)Ju}pjNh1Qllk^SeT2$cS9~5w--D{I*a&jpG@4k~){R5( z<&1F8dKGP}xZ}Q1c<{KHHM>9i^hA2ow>kV#esufx5#0xXiF&DX=ECq(-Cvib*w{Id zN{9$hvE#g?mD+CWacv0Z&5J*@1I1JB30~;02TxIdpOdW6Gd`1(k%VYh6t7xo$Ug+o z6>9%&qsI56UN@%hqF3b0RqZb3UA&|oyt|7Ej#9OS3njK>P@K$vzBM4>-N>Lr_y3}g@el# zw-Lm)2Aehi^^X)pa6|E9Nt}Wg;kAa72X(9c*zOt(VL`nXp`HoFM%su}!o%rRB|7}J z;YbIL2ntaL+9%uib!u!YyY=*90X?dnmofc%7tFnNjx&jj5dx|J=e1u)rMknQiWO&9 zTY=pXuK8hK%-lfQ&#Hzhe5ZS(nQ#t6AhOK@99Mna%ZdSWz8VI(+;6y*QqgwL02WBTT=TLX(|j2l zgABHUo!J_3?P3Q?B@Kg^htQ$P@jVzkspKNA+W?+)feMmM=8N4D@2A3SLtj^tww#5P zw4)>5ObqIPXts|o0jq#fV~toelMsA*lFk zi3xwd+3Vmui&Gq1n@g^PttZ4Pz5(uaK6{Li46{FPq~Axvy@FHP5B z^)~MSQ9l0wF0wgNgW|yP8TxWfIV3)Xowx+U2hd%u6WeX6Dt8lUCb5W;D0yeQQbpJgHhsVu+fKNee{s^+}(PGL2Z5@%G6Rh*4|6i)q(J3468lhYRc1Cv< zBCt;xbJVhou8%#gFK!s*W94@w9wEz)4|i^DenC+?oRvX$itIEOn zgM=Wc;_2h~YCZCTa0Xg+lVRGkJYAY=xFIL+D*|*-n5{u2-`u`MR@oOUH@4-r!&yoS zK(KDpGJnDRH=avFClnTsa+ttF!IF?ryL$YWM673H+?NE{=ai-+4~Qy4 zxOIP)ITl1>$T*X`Aj|6rFq#|I*cHps-m2$-h$Rd4H;|Sbe?_$;L->6L^**YZb(s1! zSRmfWb8R9az!+DOeBSs*)bGLLT+a!fr>~2wVW~J;=NCLhYA$rlcQW6V^C4V&3SSl=3w zL9rE1M+JhiK4MgVwzp5J@L1f**RybdWn?>?P62V@j`~fZZ%+VOJ#0&KHm8w z;>uUY7gEqTJ@RAdqbfJ4Iob(hdN(@i!8*s5H$RiwmW{T#u*^v$=1x&R^&v>&R0aIU zm=U5|`#+NUuXTk*aqMDm5DQH*gk4zS&c()cBL?kJZEUTs(t7(PUrXbR=zm3u|3N*t z;I(wF&3WFBX7(&z+cr)y@|Z>e30w}XTqy>Pj7n|pK*jiK{$T*yEG+Xow$6;MP!?z2 z)1(Z>;U0#9xCh0i?T2@1oFaiAujxX?;2P+1PL9ORhj?L_xzOl%-!GP-5)w2EH14^^ zbcWS&$*c<&C!-ML&)h-eNl3INclx4(RuT)flOPL^5L!xN6>9Ce!yGab>(yqWmFzK^ z>ynaE_dd&qPh{9q!V*f;iG^Mt<#5QU(W?;HM*!@G1Hl+ue^fwEo*wR*C)6esxVdBR3_UQ^wt{%0#!~Fx z8*GdCeT;LZ>C|7}j%3j+8_bIOp%Ol}uAX;w%@qP>emNLb!8%1Y3j8r%#*{$`ZFu$6 z`tEUuHB=MN(vLRD@W5pwU>032Nyg5T8^vZf`!m|zy9B#FXkhA#C*n3_9r ze!cRb{Xw?#^r#~4(oB3=Lf)iV#IoCb*c_edBmXfA1mn?c!$0W@YejNVTCA(8_=@5X zm6iy{yv@Z>ehuokW)UbwC{*EjZ$sVqfMx}x`qq|m(zoNVRXan&L0o*4u@;zG^n|X0 zMuA@0O-nxfc|1qprW#0Y4XufD)krR7I6XpS=l}&x8=aOJJ@>2=xZH3VGJK?D>}l9F zzUB$iF?dC3e>3T(gG9&1p2rhu+Jb!Us;&%}B)=P;-aDZ3J6OWA zV&72Opu^HOb(A^nIS7PBz2PO!N^RiLzcKU6Ome;h6Cub^bl}@lBV@g`oAiw)KEaL# zjt6d`33R)_d4qyp!dFMVNnnKWG|zxq!C64QDfe`f*4RneOrB<#)WA&K(F7G&mO{fs zq9H^!BU3D_c1VzK+sn}ekE*X&T=J6bMqWx3CMass$0OgA-rAQ>qz$}#@jwKauFV@e zpVLxT6FgUhXs|i&aY^jbRsZ;t;QR%Xf69A<@+_$J)(7~AD*22+Zp$b~LpKFjz-MBQ zK*k%lH}|oxJ(5FkBY@w+JO1OtsI0tO@=aoF{QIOOVhc8egX7>uWLE#^O#i1XD|3yn z8vp4P|0j5Z>!j`%B<|@3ifa!K@|=jSCzZwZiirZrZW|U!cvZ#I4$PUtoc`wUAYe2#(2aAh#5&i;%i@8G%ZW#Z34%vy&pgkaJg zaDo$-Up4yb{VOs%CdL(kPff~#eTkDx9Ts-PizEbdXT^JU1P$ z@s|w}343lv>M(8sp*IQMyF7d2zO1FHG#u4Lj}Wd}-yO)gGie`mi$(7lUnvT($5hB} zTNONn-R$tm-g9*8LrUxmOSNQnxXo!JhOl$ z$BMxn#1dyvP_7%DFfVEA#;+uNkp0u65{`_jd@vP>g-c%mohoYMaIARVu(5hE%sU+c zWl`$6hSdM2VIZ9U5@OBplz4%e{6f!v^tTxzRlFcnqrIg}gd@;R{+?Gz zmG8)rMDHAd!29$MAa&6stg+H^pfJEIAwz>^-N3=GnAlVRX4rMM`{|_!IH`vMo_RWz z>A4>Ac&&df_y*zFRY%HcV^2XtgMyu4?0EBX+g^p3a4b4#B6?*zQUka^aFOtYbYpF{ z=?|*(k-oIXT?1s=7F|i|56f%hcpc6NghM8#HA@uV?=Mr<}2d@PDP=! za4H^nep|wddOf&VK(@e>Q>DOQQUQJoHi)aBEBU3##fek^1osWKCy~5Q8PQ$}O&&|I z@yKjyry2m~AAlHB(Gh_iVhpHeskOU>V1N1FH0^Jm>6G9sPoR^7WL`OR@jC~@kHFI1d1VQLUz8!gJwhZ;f=D4(Q%0Pob7o>}I7t3my)301L| zli9It`mO1>acWAD-eeb2#PX9KKa-S^T_2mX*vH0EJ}8Y@xCvZXOmG77aYj{Lun0+& z9EtNuZDpQ1r4aR$MDJk(g**)}AbI6tzdna#QF- z=lJ@{X>i@w1XhaPSb7#&KWr?JGDznuMl)eOuY`U=m{w2lcP2oK?~9&7PbT7)r;^$OTyYyx#7Dtt(U(4{_sXd{y*`T5i@GzJ=pXaPQ7M&zCTM%Bemk zL>pB7l(IxWmd&Ev2JBVQi0O`%tuhJQx0N@eXHFia^BMK)n`(fL#F07;gd>Ahe>_a=e*f57TdPHBoGBZI=VEytaEO09 zmpRxtlon2a2jtSAf!1|uar;EGyLhQdd^GjO8b`C!XTlnEqHzaU)CRuMT3I+v*h3;b zdEAT`%$S*TawMd`-JD}x$sWcV6SLS%8rMHI+oW%vN#cmdq-2UQYo_yiQEHHY6@xAv zvx5*e93YSWg<3LgO-PnL-iE#eZjc2tsnqT}^DJ9e>Fm+ZTdI0~E4(~_LDb$-UaQ+s z+?>F8MFKDkVK(!|`tAkUjR7hXEyM0XhYJi-#6HA}(0v0YVXVBDqPbq^W`Zn<2);;c z88du>U^sAI)Em(iOL%cyN&*-Yik-0&tGha6l+Lp?naosGZNLmJsS?J>O*JOw%p~CM zx`7qD%Fkyd$0T2_Q%r^qtzWn3s=v;&aOo?slr6vGLt`2z+6xM1Mqe46@HS) zDSW2oqR**vPV#nc@$)aYoy%uMx{VSSua7@`J`cJ({s-XolsK%#>sIj!^U%2Wns9KI zT9#4XRJp~XsCoBD%RR@|mnwPIZg^wCeq=Pj4mWKnzbf$+pu^B2JXw;UN6=5M1>fq0 zkjsVO7S*f6nPzT7Q3>(C`m%ZvITCZl&f4 z8b(Lw#3!xH%h?71!BuH(TD^GT1IaISkN~-sJ+V|MA-s^nflMyTlq|w*H);U49rKY( zYmJ!H_K^-Hw`i=3C#0l`%*xt_S1h-HC1Dzk1v0o=;^^#M-557JP#J=v{(jKA$yXWt zpdI-ER$5#4IU6UMBdQPxC^|N-Ez>8W1{MY0xk{Rt2-X#xFWs-W0d`K_K5uioQnfw) zZeR%^Vz`3(c(A_qgtE(JPN2IDbcT&~u3ucdu(>UKzALup6Kg})pI!)j9)~6we~fC> z^&vwB5$kUvE|A&d>C`9%>*a7Mvno{o8DRmNc`-4IbGj4~BrGIZ1@4c>DEdmT4JX_q z<3s;)0WOpY_I!czL96a}S`rdaGSNgi-jt z;zS!9-md813u}Pkcb!*flC;e7x8coY;K@npF0t0p@@{=cr%*i2-HJu>f!IBjIlw7> zS?xpd5g$6vpGQO|QaEFJiJqCbTu(y>9;MgNGC_HMYe0qXpKW%Ao~GUNUgp<<1OWIg zoLy1zds>|b2ukg7n$tiz0d(XNXuHIgv5e-hfnxuA+$N(ZC;W7ICkJ`GDy_SMVI zS+l)mcfcEK?k3@bAH=a7nH*p*{ZGnFe)r1|riAiqE#qlQgGuJOpr!uV^fHth&QjnA zZ=a)zath-4CogIqNTzCkV>T;Sah)TUwjUj7=wGcOx-l_!eFr3YsGYV#c+(>}ye1XF zd=iPEC)J3*n>27>v#Q{VPKBm{X~q`>JtFyT?D3&Zo1;?kE>SFruV4|%@z@xQ#hI9e zru-O*W_E4|-S!&)wH`@L^j35moy~e7o=DfcPc;dzw$m`))W|#6l-|GpYti>mWlrs) z!6U0V>KdC%-`O4cQNT8?wV&_BS4KqUMC>U6nq2#pIafqPsaf|WEu}rFvn0)!IC`vG zAC?&%A-bwYowUUi;qM9z;4BX+Zislh??rz0*_lJQ4wt=b!Qeynn7c>6KCvkcdEgNU zkW?GUTy3N_G|#80j|NIBI+H5c3o|?@>{$cjouVdjBe;l9N}k4<5BI;7!}87WjJ`D| zB8qJ7FRQoU$I+pIe`z{D-5hI=Cj9uRYEK5JHq1l}AP)ei=?7Dd&sOmCcdNGnIx|j6 z%G6(N<$z02y4xk6okd=U({LvmP??3Vmla7G2SmC8@zPe+YH1K@(b37YX1ZimyT~>= z`v*k3`Z#$@FoOK(`hmUxT(Rp=b*eP6ec5D99yEEro8i?1%WJ1M1qCvOt2%Mx+Hab9 zF7qVEJxV!a|ci|)>zjwCLswa*;eKY!9Z0csMjF2R^tK?n5C`#BFMLkr@&2b>km#}a%D+|mAbb3i@fb=6c zV$|_oR4kp2WpOQa-#-)iC{*IRqoGAVA@c6(3Y%CVP9x2oBnbZf_K9Ou5cR8|T?54m zCfduO=esh0=A91zJ{{>?in_BIXN1}i+fjvSTrEj9XQ|oq?oldmEalPctJ)~~C^+WQ zLX@?9JiJCVl>IH0H7V7kTN4+{OL?e*!iVomizJ>HTR&3mcyK4)2&dlLqtU^5gdjps z0gPfxX4E6<0#CWpECf67+UzCZFFkUt6AbbOq}q0%@m?HjCpa%%-N$d>^?HVhj11W*A75o@8?d?Z zQb`}M+Y~16U50|HXDE$ElX9x>AkT5ag9^vx1@8W2s%7(O(w8_YNbd}}?8B{9eR-H> z;u-NrXSuHG^mP)sbGM-nn>a2$I|B#^?5sezX}g2)+jv|uEP(Gz_(O&*C?$SMS43i@ zxSnkphMG{>-rAOIYl{K}{sxF#|-H01;{WCaRs#GIRY_Tm*xZ zL0~>F1Qc;`0NvyAaw*016H@a0!b-N-PaNN)bO;TnhRjJrbZ2dMpblJP)zCV3vHpWP|ao(XtzuYOqsM;PSBlrY!-2NmtI6uS&{PQ3Bl;pi0)^9 z#af~8aT#hk5^$Bbc0X%Gos>+3qP*X(G1JPrH8kK>D{@ehV}^60N(`r8ACMd%He-9_ zOKEkco-}C$B3HkM=pGE?a~Y~6HGR(dj%ecnKgAU?K@tYUz16S%l^1xUGynbl8}HJ5<9=8B)r)+8(I8fEI$91 zpKe>T<9*ilqIR?g(eE^b7;@og*;9l;%5dH&=<`b{O5eBA@$uAe+pDe+cr_eTBXsU+ zz*-Q9O6#pRvzN^O|6FPQ&6VsAg(J}<@B4(l9L9z!_=KyX>{Ff7!G2iWMm!Xek{=aPFwR!tI8Uo>(%e?w8*L)!jnRQ*t&iuHg;@0 z>NaMi+5x}8gavhOmxSkJ8^qsUmL1|A41((i;?R!o1?eLS?qQ)^%yGCn0tAdJM0+}v z{82~P_*Ab-5HeP#JsUF@n+EX~g{ih<1R-vE?Im<}e9qib9r3)&bw6M37w2?!Kgp26 z@Ea|Nj~^a0X!_NMi1z*&I+N{`?Y_Fbhn3CVeOr6v_)An&qM`du@3&ts=Zoup zG|C+-=YJ|Zl6x*a-Wg~m&WT4SL&Ks0zUy=Q!M=F$@ru3h&(O*Jor6zqyQ@nto__f2 z{;as6M-)5|e!YN4=4{uF1?L%zrVj1U!qT;b^a9jh;nd&y($Wr7(E~m?8;mC(@i7!s zjpasrs28n~c`Q7X5=`Q#iSSREaJ75N6)pWUG|i1XQ5fDv1EdR9`fn!I5%Ee}SaVEp_X(2lz!7u>vM z9zLmg6+x~wYsJR6i52QFR#@#>&TI`6aw3&`hYpVn^ugoC%~)q{j?92TIw>e#!0RP8 zT)VD(z*~9zcP8-~ah5Wyw%*2h_^w z=^jo6u=R?sN~&DjEy-Rqc_4|>gU@EHCAKq&gMA7nxw{1i=XTQ1kPtm2N}`Y_DkHvA z_!_Bi&lEuriKB%*xR_>3|H@ugvZ{ptB13u&;2;w?qQ7OIWVPy)x{WIE{{Cnc$Ny%CAw2nGT1 z2X+f|Jp?c ze?EDYHWuYG9^oM*<$T(vcVyjIVX z_E_o-DVpculWN?8Qm9|JzGz4{;&X96KO!W? z=HoQRqNjxY-!AKjZ3N>ckS2_XNrc2vsZqCnRXBJoV6OV?6WYse_*l(|q7{F-3ym<= zjNspb$Lx&9_)f|!xk<|iUE1Iq7tqg)&1xBr`ii4GY}*Ve<{ns|tVSnenqF5~x(tN& zw25WbjdwC)DfQOuI6kGh(@QeWaHVh7*O6ePIgWXI;{m*7c*Iz)bdgl^AOo>L2o)_o z8S$MCRR84{N!k*vZCZG#LO6JuRjBq`-~UtmO!EGpIOW#dHP8X&y?UrlT4NC|NpFD#hExedv#qB+keSyI8t%#g(Qe6}jG zLRsHRw0x@O?v}oh|LyDG+)LQ@Xnb<7d4x^IL|kP{VzfJROHJv@IW*#hwt>HeI31p_ z#u}}Z#uT4TO+q1Gbd0LV{jm&M0`zI2=28h4(S;j*p+K#@GayyBeILeHdOp%8g3}L- zWl@igwV{{40iOR4Li?yfSZJ?E_fGR>=hv-dzrLxH^`($S@*eiGZAS0LNM^E^!{T21 zyENZFbzW`XegC$+5h^QD{?l}!EB%iK*4{INesgz9B5U+*0mrv$YcnOz>F6!%JSC0B z@9s*1U*#>iWxY~3r8fuO9u2?1UQL^vI`wvDa3`;{*p7CZG1|T7W>X;|Q*ZKb3*7X6 zL$r4CBq}|~S>bDR)eK(hnDuH|tg?0y9@ToK*rp7-P8{GFXKd#m11ZrbawcJQ5ZQCI znnz)CBd3YF2Z?{(b^-TRs<>WzcHRDKbP|cX@**;uB~KNZLMKL>B>6>v2pw?4wua`o z-^n3+#%?5Ojj6&|f@VZAYkGd(v(_HgG<1St)b?&HLdcfFtY-Ts0^-DEvM&eUfI9{$ z-(?9g0ix3w>W`_}DEX917+G5>TbsBf4roXAWys^Cmf?a{dy%Lii)a*;xr!o?#hqh(uN5UBy2#Z``cN4zw73?)NfAP|?O z8_Zh#gXZxP{2kCYm|JA^`&5F|d%=WEinG?Md{BhB*;|20$QDIiB?y{5K=m3Z`-AVE;1Do`H8ZMGDfh}1^v z8z+T+iNJ-TcJHxxDzZreaqqU^P0jjYZuW8P>Yz;(TZIf?iLCC2y)5%{_Eq#jApm zW>Ps*1R0G!C=LlJ46)Wr;PdSJ@-+9dSE=$YCqDar;Xpo`bBOfOWU$GG)(A zwRiojA=d zDAH)1XYjW0y#~GG#)tXB(a96f)vjv^3Ak*w!WsCp^vrux2_JfvMhJxW6W?Ue`7y0S zaq4jW#sZ5bT*ob1AvT<9&|Rf06mtsSX9{w{B+Bi!o zrEecfL3f6y6%u!sUD|#L)KlUVp**1ORPQ91luqsgiE>p0UvV0Jf2OPbRg-Nac16p5ygjXY=SK zKr83Z=h{CyUt=i{V{Mh19F5d?M3!)4{>F;4no2+#P1JE(Q;*6NL-;WtY!24-)?F)+ zn{sZyr*Wy5>%Sh*RA~wB%ddFu() zy}1t3y&ix0lVI+VvvcSIavZ=}friJH70&SM?njoj!*(dx1pd%E7Uon8Br(l8^zzeS zlL9a;&1Yk+b;!ITj(mYG-PgV9iTlE2#24QD=9oZtD@T0c9+!yt_8U6tM!JHmdPO zHL5KGW784EAbqRpm)tO*yuM0BTuFR41xP41^gDU~KLCe1S@!p8NdhK;1tjrNTGUm4 zvhdRT&mfRZHH)4^SJ@fiVp(q!u0{GhSdDs%}l%UEgqW#&_a4^v01y-{?8~c;}mCH*EVngc) zLc)mram<1hZDK75+^4ylkd3cfQ5s)qe%PgSY1&^>zdW zC}IU8G(!FSO)P_cq!YuJ8D$`A&K*c5LW8&}^6QRo*ldNBr*?%E$p|KOJANOwqjGjj z%qE-GZ8jtMYAGWF^HXQs!jC-)FRNWJrl1!ih>Xs`tVO~uGFISXZig)5biXuFFQn+qB$SnIS%hw*mb>-+ z?6U}sRwv3;M~CR`Cvqfq2sNc8=f;d5o@lEP%_lM4_qX=r6ZT<^%&bCf3@Ks4kphve zlYT6&F3GjP3?}48vT%jBqI2?-ZFkR=@e5KNgWCDa0a@}y2d#tQ7tZjzY+fFxv73;G zvSYZKChns9Eg9z-WL@h?LK>=#UoVsaw}IJ72hQ6cE*FyQvem`=TVm*iK~;yw%Kd8I6sL0~ zBxuEl@D&1{TubH5@k`BEnznlqpH;HO}chiP6Sx2|27}%~G0q!4n{m#v) z(ysFfQ7{flKErQQtd)s7+fsgVvOf2_+b2Au(E-ZQPH7YVzTndIVRv6-pECPM#!^nz z(eu|D6fxB!i6x^Ym^_}`ZK+1K_eWznBHwQuN+NdOnhU{ptK~_P*%9z3 z;g57%DaCe&T@d*4um}%NW7_@*E$SdJv5z;;ISaN_j%0&shn?v6cL=425eM}a)g%3r za(x?W#}@+_BEdXb*sdWX4xe`1|KC^rtBoJ@!eSvLBXKggQGWiwv0$*zE)0tQKIv@` zZjFdyl3~{gQ|z0g?pq2C}zNlDe^c!(<$XB^{_=y8`UHrLxQYDKaXjA2yaTv##eQu0wkB zY6=w(4h9sSB{aNcpk>8Rl}a|Mq?-6xPVc0zD8W&*K3gwR?4!`gay!pp^+?bDeVmrq z*TA-0Z~j#S++{mv1_1)fQ^nGx-hArjvw7#`$CB$aUzjLQilu}?b3A76;6eH0F3 zINOG$CAMU~0g>m>8O#DDb|`L;s%S~RVG|8eA!XsI1aID;WbW{KZYPZe)*=nM^qAa* z1(#y%*uFg^U|e#~F;+PRBVa)aWB+ac2Z4}Jja`qpMXm)ej6^?#-mbF`N}eXuq4ama z)=Xh}b-#qK3EnLd&q&y4&MGQ#GE#V7MPha|+GDz|QYgoxO=ee|p}kW6 z_wwv<9RixDx$@qiZEP5CBhUa3tNRF7EPTgoxzzy0r;Ywbt_5D#U5h`ondqdpp{IW^ zQ8p|RByS*?kTD48_NIGH@-ja7D;ygSC}3s_IVuxaQ&gdENYdVPvdp~*E|?fZ4Uh6$ zq)`itX)*jwv9zG#Jg>Q%w^AQHfw%iqIIh6{gfFBSji`FgGJNn%= z2CY3p9=(L~^M2(d=DYK$b(5>fV3XycU~%@04EL^z@2 zn-qgSutrQOA7dlCDEe{{*ZhOp=@pR>Z&d%x3pedVLe;im$o5cgeuoX0f_keOcdYa- zj9&H-YJel_CW!-O*dB}+Ifc2=@VpQZPO(SolV+nuX=%8F1LX_Gz<8^P1#Pr8!0A?f zv$(hS?qX)~qWMbw#mOhaX}$vg-fc8j`?sPrk3N&M{?gf16K)kEGJy_kW+w}$8A>t^ z6i@1Of^De-Kj->+5=3mKmg0_}fb&sQQ##lhE@NN^DfmNEOADn1<*U6dI)ES&&w%+3 zpUqmIVsJ@m$94GYs*T>m0YrLNDhYuZ8991*s;tt?Y*#2NqwS~2Zug-<>1zRMv$LQA z;yuAKyNO7z?D~#a)CTGr<-f>7hc~&l*=A;UOchSSq52DOAAZ9%h^Bo2t*nCH}GIn5g5zPa*$S6+hCf*FFpV8&^PX!$%_;Rh>H*SvHYO z0*SH((P}VrOmsdLi>UVMN}?b)8B6n3Lu+y;vO3G_Gnv7MNPieJk~BF#V&tJ3>ehc$ z_0d#NXV@-`MJ6ntqpMrsWjw$4OcD2Y1LRDLtV0}uYq^PjUULL6g1=+Np5wIjaWU~s zq=9+d)df45Gld<{#;Nnnltg!OKAq0L7 z#rZsDP|HYRVI^{X)j&1j0e1u*uJiBcNZoVw?O=?EWrUo*!VrNXwD?piizof6(~J%hUoCYZExd~ z@F=(9$^Bz6ys((+5R1l7`Z)sefScM%Y<+BalV6vc`>R}D!-4LZFACKz`ObmAw&tCsALrp@ZLhvxCeNT$YRBVP&cHPq` zln&ke4a?Ywk-sb>(`nE=%O}mHzZ2ke+4e-mMvtnu(uq5*!gvY=%0hJG_;+kQ2R>Fc zh`ZYtGo`fZ?A@Ey`>Cx?Z3m@p7Rf+q0sn`qw+w2lZ`ZejyStVG#fwXEDBj}k?ry<~ zQz#xNP^>@*7J|DJEAH;@?hb|C|2*%r@BPl~Z<%~bGP8bb<+{%EI7Gj>$j*?_Qwe~? z9kU!GK^VD{j&xVtDAJ^PE(8w?|IOK2{#(gftzKV)Ujy;FrCvkt}4RPDIA@kt+;7JuqPDyry$_^wNg~paT&eRoGDpTl}EM zpi~ruB6&vBZ|ReZEKYjQRl8nVN$5uU1_?A8w2o3eJBRaMvFtcaCK~?Mpac;%9Y72E zTX6TM#)kMQMFPLRHA4Jm+A|EJ*?r0wbUG(k8;;%w5mvLPD%C0X>W8zjbqTf&bi?J& zQ_9(w3>@czuHEnlFq`9~O1TlhL}cm>rG||i9U>eBMN(B{uFc9*aObpb92z|G z20F=+B*pME_nG}uauQD`Evbxie;jvzH1B(0&;LPp$NS6piKwNDAHxm$5$n{1cq6|*X zNk@~#y~3hPv8d@5lj-M5<$e270xf%&au&}9qCb(Ki^25nj9DI=aCOfbK;8q=pI++Mjt`sB*&Y#R?NSYkIgUQ3}a$Tll7{ z%9me%lxCay+HVF#Hw>=!jc)J$Uc6M*5moj6=toxZGwj|)f}4CZ1p50T!A^s-GTlkq z8az6zn|o9Or@qKHy`&L0vFSuXaI_abQ>NWYa(kyi9;x8$xA4M$@-(??)ghR-*1>()+x`|go5O^$AK81h~gPj$}|mVHtE zk_JuqwG=2<(GTMRV#j6F=--Ha#H*eyBOztP5bKi%9o+!>Bq**h_65p_3To+hbyKJ+ zMe#5hE!dRSCEi}K!sBZhpw#0Tt1GVv9V$%!XzfFnwKa7c@)r*BwfB@tkj$@VPA{Bv zVH1&sQG9JO~^(hQpam@{*=Kc!Gl3X9I9AVWR^U)d$UMCbD zd5Z(f=Hfht8p?0&<2`-D7oOFHTb{MT76hqVcx;reZ>%g6kr1)D+kZ#s0&SKK7X)v7 zj4L`ohfA+o{j<~InR>U1Ajy>wr;7_N zd=n1_ zN-tOyC`lNvs$G|N`z>s)dpo;YkxI`I!(jQ1c?Gpu&0f|z8ecN0>+@O8K!865**C)Ib)v!>YK*K`2f7(J6_mS^@R5q@rU1PNUkd|hFU_Z2geV#jhQ4f9yd8TDqq#(WzZ&G2VYz)II}6|mO@w5XO9)%LE~go9(CsINJKjWNgZZ7kg? z`6<8VT7HRXkG92e)Ol%ID&S)p&lh-a$O@;S;*T*4b^C|w#X-eK%dJiU70ocV-{tUm z;(bK~>ks@=HGlFD* zbmZ5f?8ISi+$t{BE=2iD8wHC7Qo{1^uEj&90!NBZA4H47c4SMc48GAZx-y>;HfZG3 zZaR<4@P_#y%ONw9bTRQK3J{+LgJFmimZ%WAfe^}OBrc7F+Cfc5CA4@?Na&uZ>ZD7F z4U$$B^6!sECct|gd9T?hO@=Kd*;UL8`;L1LLJb7{$xMijqz*^9)H1M>vhdbmViUzu zIyTu+Qu8z)OxQ^d8^^k!Fz`ifjk}86bkhJg+R+JBN5juxL50VZw}^pKhA(m`ZWg7h z=t=%lmZU)#e9$ey>F}YTupXjc+tNa3U=-(gpRyD|G#P0I26DRlhe_ShPWUdVUPlhL zhl8Z5Rb_*~*6ifSpDP{}VW*a?Pta?03r}OaXMidpu-~D~3A)N0=Am@B0zbm1;MP_* z8*Oz9!6q9NQWT4?mC3{(&4}Kvp`_k`Bj_5hTKV^?Y{=9GX76Yuw8v(wo&7Z*ud#Rs zqxUw9uATyRN*9Dg^7PcmQaaygb+`?bo>_&Agm48^jhgrb(y;GPaBl?{NVpa-0-~9$ zdQX)aBAXY?$Rau=^~Bv4LK=Vh1xl#>=XLwWS*4FLZXy?pbH!SPN1ZrVk-x}6sb}h9 zY7b8YSaK!OPLJ3#BQ#$s)JWQG*dhEff7s>nM9iUCsRF_SrbCvp^PXq-NSD+~q5tW$ zH6Vg;~GO%V7z(;1NvZmqm&p)_JrpAHL)#)MIRL#@{<(Gr_Jw6G!UG9P7Skp3;nqeGjMff|lu4E{#U`leuy7(xxWAUcXtZch!91(!Pe2i>Z) z;KQ8tY7WuQ>@Wkmb40f_na|{f2rG`9cxZ|(B)|Rks8I-9zFC*POHJ^P4Y%mewWc6) z32uR5F}>@-hDg<9#i7l>?1s53>6Sc`prMX_08vMyxU8wUXETFoE9I7IYW-Ron6eY4 z0?vndJI_B{#s(*buSC;E;|)|(vi=turZE%$6L>sl+}MsC zRZo?qn4oagX`lm2usv(+DEVH>sqzZ?_>E^gc0N;yROnzl4nju-f`#v12>>o=dy0^k zr5aoBC#89UfW)MegM)Gjs8*4wN}>(#BHzjdsS0bkZO&R!TKp#dR!lRyIz)g~&7V|O0o zW_@XSYP?-Br*FpVF6rxHYd8LlW}hj>c{d5^@V+HW{-}dy+(@7;bGmK)kz)4}4z7at-{;ud{&Ish@YkVa z#;hKjz0nOU7$Sd67E_qdSOz-{g4WYTL53ll{AU6gn-4!aw@ z(>fE!zX`2|qZ2|BbE=Ox#M$k7Y`;yyNQaO$G+30%Z zIk~2ipGkUjD9XLTSqOhR1Up}M>UDwn);;E9TN;H&a*S5;KuwH~!70UQRssd*hX7<( zte|2`m}4#H7%Z+qZHZE`{Zn;CphiW7IxSMo1J6u18h41mJIba06DI-@LuhwbvAnvC zTFjSDIRO5ruocJHg_w+To~zQRm$YIBlTW`l#s@khKYdhO@^A-6$T{@>Zc{j2Obmq8 zSqLlqxaN0?7@UHlgmBS$m8{UDva14(j5S zn!K>DAr6&4@2<0UHpsF;Iy1l=$?|8>opA;h1U{BIV=QZfg9`uF^u*kbfSjA-8~r>< znFV4iifS?CV?39Ti{y%^-SLy`2V6toPiDR#)wjoUnU1V;?4}x?NB!{5)2vj&1 zqnBX9U#fTExKZJ7VQ(>HW__Hp$xO-3Ba7+bdWO7$n0e3551r? zzB&b$9R}SZ5u(!%7$Q?!^AjpC^xkXJ#k7Whj6n3meYULkZdWrnYB!}VgN(jP>P1E= zQ(R@3E6|=>$(V=*f9`wo^8D$$K%?5yVpVb@G%ite!>k7?zvDl;vg-kj$RAxj*?b+u zReD$OjcsG~weR}wx>muh`A^wiCud=zOoz6;&D+SWFw_^HTwwQ&%?QsxrE`m|Cg_Tv zJH#}84reiD-?b<7EDO`QC^DWIqcHReL!Y7NO1l1UtYPi@4Tox^P<6|VtU@Cx)g7i& zXLi3n!+cyUjzsx~vr;EbCV7I!x4)TJRy03OFR)@GNQkR37}^x+b2s&V&_;9EwTA&b zFG!@VA~r~~=!fx{)1ak-%fVTp+I^r}7&@x1!FP;VC)uF8|K8E3|233|y|gFxxhnDL z+f$G*lGXVb&*9S}(JSq{NuB3`2QmW>Y%}R#U8K{`GxEukJIF5YFJ4IyBo!jR{R}h^e2%Z%R8HRqvgMmI0$f z%@A4jfKAAc-$=rn6G+KO3>B4yO4E?)(ln%uX)v9Mp|FO$c4j0Za8K$~Ij|Zh_R-u& z$2Oh?>F0@5XJl+c;W;X^iKCvX+L~6OEy+DWNxFurnj=(*6ZM2#hJ#&?%L1A zYYSw^>Z#!)z_tXm7j_)hsYaz=w8m@+Qa7+fcj&Nf$gOM^2v=>|A9-5zezkM599B+( zXWJVEr`tB>Ixb8uZ!*Q#c@~^fE$ZXA#n5YLpYNRdF9Ha?*9&3-Bx-zx6n45l`>FC- zk_S~3#(7prru+Yrs8Wa%$qbHsnL64jKK`Z?DY!j?mGnN%6Jbyvl_XI7bT~Jd_mp8W zNGE`{o;ra>(4vXoURW%6V$SH=s|G|CLUnR_o5$;#WhSXwbd~HmEVpnSd-K>j zeCOZtq&BtJ&OD2!FdM({VXPLG7lRk_-f3!gXOCy^>fx&O{Q2TzyDrKJH~te(<+kqD zl@q-{g44ISwiZ*65S5^CN8B+3qg2`Vu*g?>7*(pAuk&g*VdVme?wM`;?`+J z74h*v-IXdLWUk1nXJcw+VrN1ZBzNrooUV{Q{k-%}t7~T48tvN|^PK8I|EXAzYDs^~ zhmDF`F1_U)-&FbAX5(fM`xgZl@7s&?H)d~C)5lE6l=2GuPJ)O~2WC-}v%+_m4D>Rl zBJKL-(sxV(Uq&P}_64L0SC35AnI+tc^t ze!HD56p~{4?Si`h!knODOs1B6Wn=u9#k>7>GKq30Lr{EfCb3G;-~v~)?M~!iU7Wcx zu;(ba?(mfq@5TP;Rgdb&@$DSqVJ-*VrzZ=UEo#!E~ z8*M+=pHe!4J6En=UVl;#P@)4+==&vLPa4-wR5ID?*kMK%h_$<1833>{feQzkiyUiS zzt6grDUq^(C3=D(j2zH!o#FwV_0@jR4lIITCznn;4jLk~egAMJp3?x#BpnQU8`f}4 zj5%5^oq{NH1V`8HD(4cuZJ=r3@gDJ@U1nQS{LU$W3d4dg=;MWeB+jr9E*q&@a>E_+vgk$EaLt<wR|XVpeO#2#&5*b4i%g;3QkH@ws=d>wnBuB0Xp z&gso@UEHZl^SZgZ1O5sAn+h_$^_aQ~w#55eqOLTsxW6aKQt{Z9Eh!`^1lkECPv0h5<7731D%qO#mNi~|AL3!c^L^QWCoM=EBn9$ z)p9-urK|pb_8*^t?QYQ9D!p5dASXN3Y*_cFosSqp9q%r~N^zh9BLiIGR-NgUUv`43 z?r;4oP!WmGDNvy1sn2&0r(X;Qu~lJ?hU5KzgmkW#is zG(-^FDAdOM!-*p+H$1J-UJt=eV2TZ0M~O;BPV##gLrE2FylH02|7>o11D`?=^3@EE zYjX0ReUczWG61kY&hAAoRhXT-($-=2|sAA?s(N!q28fX)N1 zKb>e8IwTlx$cRQ(%+Sp8x~vDEh#XpGe2Q1gl($5~KY~+A-IMRYU| zZz?M}AyG`ijv?=e(Do`PEd@kob%=_`AZLP=><-c`HB;3^|7hES{JZE%vC55+1nc5Nc!B=3YivpNxvodE)3;Tk%Jcs{NMY zh7Wsh!8wW2Dlw|akp+XQCuB^FjejNi)~fqlR{w&W9-NWB6x@E|lGDyyD8t z%3{19?RxAokWJF$`tEge0{PP3ZtX53c?acN-+B96ypw*_!fL|_?@e!&cae9)>5?Lo( zC!E1t3iI2hMZA`SB_o5FwXzu^YVV8hx`7~-15>=R-bK$wCe6yPm2wuS17wM9SHNpL`Ttt>Oq>>JAFFaL;|u|EG8otUgi8}zl9l);Ps0<1JO4X#|L{hJ`k z`|Km%E%IVcogoWE)~EK`Y7*EnxB}j~jg61Fx2iUAsm$&iPa-~!pS5AXrmV9!8J`Z| z28>jBWs`kA{+p#KV|7d{NF5gx&rj#2Wh&mb@Qc}Fi}&>ceDa1UDMvwdO3<9#UO~dL zJ%z*1^(I89u6yy-Ybx3Ya~EZ3jJM(eVI;ch-Cxz*BX~S9Jsqk1uytDL`guI(D}s>4 zii6f|>|KDtlbC7S#<;kxvY&+ItyKyELq!iWB~PuGU(IeJ4lU)4%1+hL$*~%RK%ak3HFI$x}sB6P)E6DxGLPV(~cWunQso zb(~>iTltpp{1+M<+ScX-+{&Mi<(9!x=fjmkov;4G6qeq0wWlqhh`I80JOUIX$F#Yk zrGt!pQpFY)R)Kn71F0mZh-rk2%e85WGBQaM$Dfh+hGo)_2Z*%DG<-=STTFO8^RwcI zsu67-bA6!;#YmF579Y>F00gCpzs(fxHKaN>Vn$J8vVC{O2|duLV0epCDcNM> z$|JYCAAWY3{XKZ_thDTkl;aAsU+|w?fc24mRFIza*^^KSDR-81SdRr`L~@Cx8n?Toa*geg zSXL7&1;dN2S|iwCX_}mt1u~f67rj$(;`BUY0+*BzCY5HP0z$=GD>V#cq~ZGhuc78w z#OTLbeF?>u+JD?M%VqL088Tn)e)N(_p(lz#VF|Fw-ey{qNfm+;Jhi+Je@TS~716p2 zd*>^X8Jm`>(DDP~nqu_G_xJy935-AayTb3fYis&p6$>{~#jF|jhd#1aPJT8&T+NSp zi_3tIoEko_Wv?oe_ks4mY!!4&?f$DRhn(5751#l2cl1Pm!^kz zc<0~smoJ2mdRdI5pnepxv;wj0%5`Mjsp%y?BM}~sY_Z9(yCWNaNnq!4nY?3$9r4`J zi}?&PZAE4u!S~>M1Cs|8S=%o&M}K&&PLgOct!QQ5*yCY^%)UQ`A0i!z62TIc7)j{U z8zw&f>rH!!ofouOYk~@E=_Qvkrs``L=hJO}RXy8HIUB9e#!P?ar&sj9jkh{x_~}P= zt@~mUME$b*YWjur)RmWY`A~*ExD-{oa-6sQA3zDvuU!i=kU5FR&1#_(Y4Vu40tXP|C(^I5G7 zXqq=Gp<~AXVI_r%2>JC#6WhfGQAyswZrg_J@#|;k35DlARUKDkojzfnjX7Sew-{`k z@!s|!;K5AcxZPJe_29_U-;Vyt)ttg0Gs30kr|y1`b%n=XTR?Za%&b|(@q|`p+i9k( zC=7Le%dtMj{VHtZ>VQa$$DNI2M)~kXq1y$qSx@gR|(2nk+k?z)wWal68H~* znfG}^$@$sqapN-2aA)_%Yof^dP_Hs@EKl$wdBSjLFTz@(9$x+H!nwpsZp#($DrdCw zCNFQlsZZptV&sio^vt#1Sn`ZarYTZT0z;Z3U#sCZ4%NkwqvNJ$fyFxrzK2NeFf=j) zmX5E61B7HieF4kIXq2dREQmp?+mIhiBr%qN_HUTwGu1l?Vdiu(Ymzv&Z?pxQ%6glIy-bvRsd;v$?v} zQZjehB0C|mM-z_*_~|Pi$rv{!fhgq5A*Bf_GhV!~&1J4a2DHIZNqt8Xp}}QTi_C(r zJJgHCdiNUh534R0A$9(gNjg*;G5_Ri?lCwawu)I6q&#%v1l1 zjAv;Oj7CvC@B%BN@s2e2u5z8T10{N&7;HJtwh)_Iju2MpEM_#}v8eYt-=-MSpXcWwFKN*`#5MUy0_$)XLa`pxxa5 z52;nS2ham563#w({R``O{l}UF^_tV}N$ZYitMS)UYz|5QI`N+qP*26s5zRk<(s4Jl zF=OqqmPH836(L|sdh4`uajPtT!g58{UZS-W+FaAO_v~85dkV8jEkwW6+nWxGs4FE| zE32#fC69cftbR!DpVdP8PKN{BG9XKq5}aP!j@8qNytZVfSjs||rcvGKDa=rH6 zNvj{FD&Hi&qgVH$_7SY@F-bRe{wg)1>5>+x_YrGx&{i9r&enXdwlblN&Fcd4M?vQM~G9<0i|=s z0sx-vIjq$iNx=srXzq$h{R)lX#x|Ggv-!}6&`>zYKbFqsy{or6v-)uuF&<9)Tro@f z+d2sr7W0rI@#46W*>G17xbi+2B-;!b}9Y2@&Yp(OR&xKcCf6 z2Px)sPanI3#4CGxN~V{|hiik=$-nsvb({*vyreRl5dhk*_XdwW&pE;Gg0Jz63sL>4X>}8Mi@jf}LXP`x&RmluG*46$% z^JGC7wHH;9OFM2SDmQ+mA6i}Pi~?4hefhp3hK0uB$#j6eLi#MpP!K?Y#E5fk3ihla&Ow@a)0 zC47j5Ji-Z?g}=pE@Z9M{OThnwEzlkNm=?Lp;cc(r^03{S}vj3Jzi)0y1oO=1nwvK zr(i{{_+%)vOoguYsS>tqfB3iR>c^kx7Y?OS^?C0-`l56EvZl@z`?VFfCK~UeB2wsG z;_8z9r(sU)-F~5~XYSqv+M*@6(&jdi<-)UtZ!&yGT~A-`03;l)jHBo~@G0$RSN8PM_a-yoI4zd@?p4t-8vL{2B%(Cfv+eE!TEeQuP z(0P*7M|A6I38H8FDDNj7Uic{O$=#<8%g?ai5h#xO`m3VLW6wC1BG6b2NoMp2{^h9q z7Pp6?&G97B3{8!{oKRh<1_xJ~Seq#yVzJL*>-e8?krL_!6q;{c+kipLYP0whIhcFx z4^@%7zUyr{%FPcRKA)CS-b8aF4Fg$|6rvLZ&IJU@{cub2ho*rBtyNnoOyouzrk%70WqrFTdxu@*k5Z&Y zYHTanC5J(3P(k_Izj;g?ruNRzCGC2Jfu^YRcB>ZglM*-(r9cn5b9;NFDyel>GD25< zRDHJ6jPa2~C`cgJ#NuxLhA(hlk&myeSe*T| z;ExIOCRO98;m^Bdt4d624iNKxF)KNw95T}22?lNTFfsdBZt3=Bb>d;9;qYF9+ezb? zGkyV+?O9SzCaW~$xNEUPI-F(#$M6;R7BEEm6r50E4yM4ilDV5BmfO)7kB;gNM<`4H z!m9OGcN_>6C~+`{b*1Ma#obJy|mjrW`gm3Zmk>!En`xYV8We+RuKr970BF zGfG&Wy%9GF@sK_x>(4qO*CZ1gv-2|`exG*EqS%3h4P*_YG)X{Lln0GaAMWAasPE3? zrge@#mjEW$*sClJeI2o}wbTz-t_6(O_wV9E|Tge{6X307J@M-3$SB5}l% z+18@*DLP?bj_dcIoSuuZ`;C9Y58)At*Lkn3F71%|qCRX$)I3mQVq?LaadcoMKNCsD| z$;oJs(<};8pfy|lken%Cj-E`aZI{IWBBN$`Gi?ErY8fApB7^$eCOXV(O{%g4Pb)0# z#=_a}8V`vE+oNnuH5Nr*u@k7PhwLD=s+O5;*+1i>Rb*T4*!$=yl%D#vo1+$Y>0aCZ zd#E*=BAv;{OfVzvaJM2hrKaVu=<+iu8 z(kRHyZVv4on3M<8vi01nDCwVMi!X}wnP$U!lBc!kGEi~%_D(C?OyV`wG=H^qDG%k6 zv{}R@QsNC8>Yw_a$Zemx)5Als=HFZublD4kx{X6D!bz?oe zwRaBm5q9v@|G=AfX@5 z+0AJ0G!~fi`MbFB<5Qi>yqf+=u&HU%?JK^SFohA(mKsJIH>ZE>22uO+!ET$a0<|5` z1&Z}{_I|Jsmm-J8(C@0#qzKB&vI%Ia(2hsurhp+qrFRUm81=N@A*9+5#R z6t$RMb5i97g(g+PpheYmlN6zhm|)DlM|TJv6T-~RoNQ>12@nFikyzx{AQxY?fB(iw z8qOeCQFmBHh{pGe#RB1HWI$OmqNIty)OeI^eWSeu-H>vMa23!lY-nYPTn49g)?U~s zomLD1EU)a`tu1p!jbosZX-)1#0G;`Szu6p8o!ORnkFiCP zHA}&U!S*gS@Z+WmF{HqIqA7mP##9THqu*_t@s&tR56`Z*+(%-IJH@iQ7`es@IdjjD zDj<;IP0S*8wzY3AVx5zwMXn{}oBuRDyD236C==gqPkV4bE!2h=TTboP9JHv-o?Ik6sN`BbyTgM($X2gY& z*Z{X3IWef*URH6FWdUY8i2b(m4Hg>Ua6fw|PC)sh5*J&X(Ww`Pi<9!4_8o# z^4Ewjp5P)6UI;q4EyqnGGfDJ2>4->d?YlCTa)|u=t4+=Qd?xEqKX`X?#cyV%S6hIm zGr^}}tk46kwMc)Vq5I5gO{2gFPqkSi>BpFa@TM?kg1INB7PtIhw8$7i602^^6>Cy= zFO9WsrqjsrdRf{ho8#+N8X1b0w7hSU5xzrn&*>?ZW0~&TV`#KOtDc#wOsnsMmyZGi zRc-eF0SK&Ro;?P6R-L zif$*GZ@)6BX21Cn@+63AL8&|%djoWN{`L5rvd$m)d;Zz$SvSx?q+Es-i3tT8i!UGf zBM5lxSF~Yg#-(|4el1KzX{8+2B+OVV|Fiw>*sq({##UFF?E5NfR2dUrI@5j3A1SW` z?HNQwy7HUicLf@V>&tZUT@0!`8Zv-Veggf{1eO9`ITV2H-(i+`avoU?Y^HE}L{3W> zgDaxdCk#@8d?IOgpGTF$&^C;Fb(7)c*X2nQu)5sNQh)4^WNQ0p{qwhx1Dx6@Og?!Q zko;VeZ3qjNG>KH$IfPDw-r0YSo~@1svTM)A@7ESC59QG`WSdso1QlKbCKyAM<*KQq1@4)IoO1Zz)qWPD&x_Al$XnVa=*k51 zBOh$2zwhARwq@1j?6zKAo+BnT*wVr2&NOMFKi6rYzgl)=&5=eMpx4tyOtwc%>i*bq*-qNkx%e}+dpqi-^FH%oPTH%hou-z zdF8i_Lb&XbwHA(*WnXV{q0wjE0s$9`mF{RCjvT3@+S{GCrrE-1oLse|ofwkWW3ZR< z%v+u;bCj(@pII%h(|)}XG;8A=+d`gfCS%@VB$w#iWoSYAY@L{m4+}kVcNYP;a9>6) z1(yTV%YkKRmvEdV&>Q}oL`PJvPC6+&D+LW#qlD0ONzYCiM)OS=zReEPCm{xWk<-vb zpT0vNLRO<>d%&Rol7KSeROld0o>E0gk8b?ZmacBVR}Mutj3$jn{^A(Z zkh(Z2Mb59%JZUnI+xA}C7N~IwCS47bHC88Q5_Lqt_7=IAxpTtrghlD15CK!+Q z>#6NNBQ20w-j_AL0qa^{p4(DA;xei;RIfwlB3P^%K+%T&v11yXCzr^-`Q?&{~S*CP>j7I|R^=D>nsLt*cdQrhg`pNA!BdL3Upk(kX$+Ut*w{J2osR?UC17?BDn}{oh5sdc8^`vg4DZ0 z9k^u)pyEyW1=@0y7~pWFTw*!iYEek2@em@Hl>En7%vFSTe0B7h*4Sb_npsqA%y0lY z+*&~naO)3uC0Nnc$CN&h28d|u{I-G6k)4V;#zj;S$YJ4p@R@{bF|sM?l;{;C_~r7~ z=;Ct4W4HS(cwW+o6eFi=F@Ci ziD8(h2LXUGR(xNerQs0ehMo|KDD`O2ch-QypfIzgtW>6Gdrrer8clIWx{6c|$oPhg zz`#W4^t)Bkf!wqwOKlS^Lt|JtiLO!u2q z*qg|zxy@ns4uFA4|h!h*3zL)q&)Aklc<~Zu;!|i_q}Mn=ET1+Yezu3P6O0^E-YoN+a5v3xQMM+ zI}>`iFTak&e+~@x_-w!5O76v6$zc|h`A#Z^B&{p&-43eHPNl@Lo|BQO?H7_@0!V5aIr zMLn+a_XMu7O}w*Y#UpZOQe)E+tmqlM(63S=!Z#BpDBQ8f#LX`VV@;i zt)tcIcL6BOSgu?E3@(zN@#JvQ$oe{G-N2doI};h-HY{UJIV_*AnR3h(>y2I991}rVpDBK)K2MLj;-jrY%0r@I9m?g% z!bs%85`moaeo0P?FP6SsIme!vYCXDGhbcG~3r$s9<6@2GCmT9O%5Z2!6`X{w*hc#d ziCT>A6v1SZYHExXbLQ&ihsHV`T0&zD8NN{>;p`;R)T?JOtFSPj)IY@1XL}G0N55l4 z+(|&OPWaUz)`tQx_>4;}$`Y>0<+=ohAjX*3$24Cxs7pOsEp4bHrs4!KUCGxJes462 zML>T0LxNx;M_aV&NMt>kdv_wCCNbaF(sr-chxU2&*v#&8U+%fjWXS#*EDq5SPMJa3 zNKDgkp?#)H%fyZwn3Hof4(pWQg=<4K^^+}wX3^?PBhDzN zv`0}OvxuK+uXkiIwCD~Mnq$Mw4?TeVQ z$Q0vw;pjCxh72Ef0WoBE>asDHrn!@!L*le{`(_4z_SJrE+8^PEUs)x?l?;;~yeiiv zyygzBA39Q&dYAj|i_iKeIhB~Y^b{y)(`Urdz5959_yIqNpynyCT(ADN*C(N+lbwOw zb2HepE(eX-B_&Vws{3o9WZ7BePhV$`Yrox&_=>MZ4`z2(pH?ejZx%(Y6Qm>dR3}4ik>R=aharZwUgfmhy8aI-75U=qqTSp!eX!4r~Tzk z?raq@#Npr8tCwI@>_LpMFFMl57Dav9Qr;=3Uo-%Z|M%DY$;Ep8H`|Cvp{w zC>U!zw5AQGDWU>H**GrI$JAK~+B%jwEZ%$0%Viip_ZImv9tli5gZLODNGKYjg2cVO zNY50N-~rZW*pRk;RyQ2n(k6x60SLBX7`+H2h(nA+(=aUaI83%#D7cX>!5+0om00fg z?7BBNzk&dHXiE;AmfcCpoK|F(lpY9Ukf9N;C)VZak&(8hQlPPa|6_B!Rb7S(PU>BA zmro^Yy^+;DbUGT3gSuh!!?Cu(hFFr=SW}2(JztQtsTf!q+YV6-Abzi~@E*l5dD#U~ zKM!IQ5Q4h(1Fkl=aP^tXrk`5hqWvnQyZ4bw6|F7}^EQv;S=DyDBR^9oz@^Y)UC7l% z2v=it;f#;X zS3HqYGX9ItQq&kL=2R@+Y^ZYi-gp`>n32ROCO$5q(KJd@I4r zI1yGZZoZA+tR%D3VV@_)`p6$;fcO_Y!hQ*_-@jQupX`!h06+%wAFs z$N5CuZIZDunBUO8dv{nJ7LPi*f&H4~(kcO)pgsv!trdgoLUx>6 zh=0Zh^W=-SH*C-vf@XkjGyBKf`9pEkWFGg@d*iGk+28v2TVN>RSJl)f1(|tXm#A;x zBUk3y;!=Y;*A#q+Al{fzF(o6SHVzz8_KNa97194?QX0GsFGyy;!;aAg%AXRV96Q`|}&ZV+N5MrteU$r~VxQ_4fJUc3c_jP(Uvf(;EvPbhfN3w}ZD>jtdrKtkbmdoe!l;nZLFMG`;uv)(c7)=>iZ zo_Xd*imvw79tWrEn&=seSNNY3z9aKnxIOFkM?aMvAze6J($PA5dGIT5>t2=ezK`S`+cdEo&Q*zts_XcXa9ATnHfol)MLAJs zEF0Z77i^H}@@SL+_A{IF-&#>6EWWNlO)tM{pGii=EjO;t)g+#@`-Mxu0_!~c(t@IZ zrHHb)d^|Vm(>kqPA9-Cs&XoXz1b`X*T$><26WlFEK5x8&H4>U!4Aa(j#2B~fi(kWg z*Oa~SrgWI}7hOcxq`z(G7!XeHn>9;)2N+>QD`(!jewhV-|LmE3_Urq3`QIVE{5LnozFp$0&n@|(eS|}JCa7inZ z+TclQK!=)gJfwO!IyvhtP=ab9r~su!eM&ScfizKXY&`0ha&Eu_C>1{aJiwL_=Ly@l zW`+@HZ7!x|iCmg2ghDh5Wda~0Kwy5`S5G)-oZk~99!Rdum-fURjFJ;3SL2X_p6IF6 zB||}PS1J*VoOA}|)wsaX`~Ad`#9P;bT8a9B7O{p9RzWl(*YMaapTbCVI;WgJ_MasW z;U~6=D0@m+1HLXcX>!Nl3L?Lc8ia~x(7S7tp+jW^ki4a_ndV)?l!>W*XrbV=_EAgKabfio6Rb_$x!*wOK>X5- zPs_jsir5;XucDf#Fhq}0(sj35%e4(+_Pzv?Zft!X`S>-e3ZFdptZ2rv9Fv!d?2H2Rxtnk6l=`)m+s{=hjB9^*);Lr+-^} z?G)X0a=80v4GcOyFny+Z``pW9rnz^r>6;T%lb85{wF;C)^vjd9WtCa-?a$7kB!Svz z{WYEqT@?v#1R+iFD;Fp&$LBiu?VuK@j-xvV=NlU}eoe~Gq!kTl;BaFl?RaJ?Cx{stG@K~GU%n2ki%tb_=b3D$Wh+0hpgkp+$CJcd~A+47TL6Kp4 zA(bVBfP!}zH&_IfL(tU}-G{=!b)(?cQh1;}qs+`p=Hks3>r)Lx2!g`U4p^{n^GSDmnRgMG@vx){QHUUGa+g#$s5$Zj5V zNhL!L=-{lvZQmo*a0HSA!SsE9u&GubxkJuOsN9gQ2_@)86M&7fgZ{8*z~jZv6puENw?Ay(#D<#he-bubLytWf2uFik;7ssu1PKsw}P1QI5b9 ze+fLWOXI;qtn9R)(qT(zdLHWMJZeBJ`vr9IQI^ZqGMSxOS#G$iGmBj)mty*5Q}(wM z<;cAsdrqwkrd@pW=v@L|#+cs--U$9i@z|ldK6-vLmfiP!6?@5am`iDJ)ktxe?u1V~ zR7h%k&Erk~R}Nv(8;jh{Mw3&F*7$wf!3wOYcYd9p=U2E~-XyOp>V0BN;groy_dG{) z0=O+DB&fKhkJ)K8%4rTm{TvnK00JnUsu!zLPLOUTQ%H3yXlzK>GK$0D(-@K_gJTwEHSMse2D- zxS@pvnN)B)si)slUP40L$VTAYxywdUmq^Z^#KfRrVgAvzf?lAMt%Igi=WFZD5Dper z1EYGUXhZAzM|5YW{(ywb-NVtgybsY_f`{wqxQ*%|0&#;NI`J;KTw9ymR{6y3&4R(EGFsBIZfxf|%daAseY z6$I&o4K&xQHnjN5q#t~Ip6liNuw_HiC95JH*W9peAeH79>HqldulM#Las&EtW^M*D zzV$vPV*QEDS$>na^`DjrcKV;JJFF+O)PCw!=9wxZ+ZZVdjmbC-k3DY^v(5Bp&PI0b z*}eB_7#Ft?w|2HKjgLTa#vb_`6G2qVl1A3)Iz2I-vW4dbN1G4ZfJLv&<1@1aE9;oj zuQMSZm2_-v1A2`X7pa+ONi!_Mujiu?U?zzgav!Y?Coe5gb$n6AVma*69CpBy=7Fk` z`%}&$520X8WlVXTwtt+ZLgj7)J+~oEQ`ya-4AH*uLp?@)-4FW58LziS?y!bLwI)1v zwZ{ERrFfk0>)A2U;=5gEZvS^tdR>Hec^sKt%@5v=QQrg9z-Dh+Pwv#D$ zroP~GCsQ_4hDU9g@6da5f86Z;fEdZ2xVNjJC|n^Ra@N({NI`!+llkgP2(za%&v~F{ z{EFw>=FiCyNO1jZSApZ*KX67m4_@Ku?jW|ysJNVW_r`V!bW}_}-b2Js z;$|28o4jxB!a!oShl=9|(js}<)H_A);sP$pgcABDAvc&M3zG;*EI*)$=WNreRRWWx zli5VJlz{}jPO~1Y;7TV~`DLCCSNwsXMeJ92k{Xez)Ogq0gCD4OF}N6%4#Uu@!BeW? zWkNuUSf%n7HSm9`hg3*aGpNyD*8uKYGZc1(W84atwj zW7dB_n>Qlb(Ht8=tKRZ$M)uZWs(MnG?$%|9|_&LSPWh?Vf*_%Uz%3Zpy zRz_{+-yUlvN>5=vZ(R@JAzVa5$2}Qj%G<+U(O(m~^LeW=N-jPZzBFqHlJw`@e*h1tBkuqJ literal 0 HcmV?d00001 diff --git a/docs/shaderManual/ql_32.png b/docs/shaderManual/ql_32.png new file mode 100644 index 0000000000000000000000000000000000000000..03fc327016e06b003836d06e8bf30819567b2c81 GIT binary patch literal 2383 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 + + + + + Q3Map2 Shader Manual + + + + + + + + + +

Radiant Editor Directives

+

These directives only affect the texture when it is seen in the Radiant editor. They have no effect on the surface in-game. They should be grouped with the surface parameters but ahead of them in sequence.

+ +

qer_editorImage textureName

+

This directive creates a shader name in memory, but in the editor, it displays the TGA art image specified in qer_editorImage (in the shader below this is, textures/eerie/lavahell.tga).

+

The editor maps a texture using the size attributes of the TGA file used for the editor image. When that editor image represents a shader, any texture used in any of the shader stages will be scaled up or down to the dimensions of the editor image. If a 128x128 pixel image is used to represent the shader in the editor, then a 256x256 image used in a later stage will be shrunk to fit. A 64x64 image would be stretched to fit. Be sure to check this on bouncy, acceleration, and power-up pads placed on surfaces other than 256 x 256. Use tcMod scale to change the size of the stretched texture. Remember that tcMod scale 0.5 0.5 will double your image, while tcMod scale 2 2 will halve it.

+
+textures/liquids/lavahell2			//path and name of new texture
+{
+	qer_editorImage textures/eerie/lavahell.tga	//based on this
+	qer_nocarve			//cannot be cut by CSG subtract
+	surfaceparm noimpact			//projectiles do not hit it
+	surfaceparm lava			//has the game properties of lava
+	surfaceparm nolightmap		//environment lighting does not affect
+	q3map_surfacelight 3000		//light is emitted
+	tessSize 256			//relatively large triangles
+	cull disable				//no sides are removed
+	deformVertexes wave 100 sin 5 5 .5 0.02
+	fogparms 0.8519142 0.309723 0.0 128 128
+	{
+		maptextures/eerie/lavahell.tga	//base texture artwork
+		tcMod turb .25 0.2 1 0.02	//texture is subjected to turbulence
+		tcMod scroll 0.1 0.1		//the turbulence is scrolled
+	}
+}
+
+
+

Design Notes:

+

The base_light and gothic_light shaders contain numerous uses of this. It can be very useful for making different light styles (mostly to change the light brightness) without having to create a new piece of TGA art for each new shader.

+
+ +

qer_noCarve

+

A brush marked with this instruction will not be affected by CSG subtract functions. It is especially useful for water and fog textures.

+ +

qer_trans N.N

+

This directive defines the percentage of transparency that a brush will have when seen in the editor (no effect on game rendering at all). It can have a positive value between 0 and 1. The higher the value, the less transparent the texture. Example: qer_trans 0.2 means the brush is 20% opaque and nearly invisible.

+
+

Design Notes:

+

On GtkRadiant 1.4 and earlier, if the shader uses qer_trans and a qer_editorImage with an alpha channel, the transparent areas of the editorImage will be 100% transparent. To keep the solid areas of the editorImage opaque, use a near 1 value for qer_trans (eg. 0.9999). This is useful for grates, windows, fences, etc. If using GtkRadiant 1.5 or later, use qer_alphaFunc for editorImage masking instead.

+
+ +

qer_alphaFunc func N.N

+

This directive is only supported by GtkRadiant 1.5 based editors. This is used when you have an alpha channel in the editorImage that you want to appear as an alpha mask in the editor. qer_alphaFunc by itself does not get filtered with qer_trans. This is useful for grates, windows, fences, etc.

+ +

Supported functions are: equal, greater, less, gequal, lequal.
Values: positive between 0 and 1.

+ +Grates using qer_alphaFunc + + + \ No newline at end of file diff --git a/docs/shaderManual/shader-concepts.html b/docs/shaderManual/shader-concepts.html new file mode 100644 index 00000000..caa93477 --- /dev/null +++ b/docs/shaderManual/shader-concepts.html @@ -0,0 +1,190 @@ + + + + + + Q3Map2 Shader Manual + + + + + + + + + +

Shader Concepts

+

The graphic engine for id Tech 3 has taken a step forward by putting much more direct control over the surface qualities of textures into the hands of designers and artists. In writing this manual, we have tried to define the concepts and tools that are used to modify textures in a way that, it is hoped, will be graspable by users who already have basic knowledge of computer graphics but are not necessarily computer programmers. It is not a tutorial, nor is it intended to be one.

+

The Manual for the Q3Radiant editor program contains a section called Creating New Assets that has the necessary information for setting up the files to create your own custom id Tech 3 shaders. You should follow a similar convention when creating your custom shaders. It is reproduced here for your convenience:

+
+

Creating New Assets

+

If you are familiar with the required tools, creating new assets for use in Quake III Arena is not particularly difficult. As a rule, you should create new directories for each map with names different from the names used by id. If you are making a map that will be called "H4x0r_D00M", every directory containing new assets for that map should be titled H4x0r_D00M. This is to try and avoid asset directories overwriting each other as the editor and the game load in assets.

+
+

It is recommended that you study the scripts in this document and in the individual game shader scripts. Pay careful attention to syntax and punctuation. This is where you are most likely to make mistakes.

+ +

What is a Shader?

+

Shaders are short text scripts that define the properties of a surface as it appears and functions in a game world (or compatible editing tool). By convention, the documents that contain these scripts usually have the same name as the texture set which contains the textures being modified (e.g. base, hell, castle, etc.). Several specific script documents have also been created to handle special cases, like liquids, sky and special effects. For Quake III Arena, shader scripts are located in "baseq3/scripts" or in the compressed PK3 file "baseq3/pak0.pk3".

+ +

A Quake III Arena shader file consists of a series of surface attribute and rendering instructions formatted within braces ("{" and "}"). Below you can see a simple example of syntax and format for a single process, including the Q3Map2 directives and "Surface Parameters", which follow the first bracket and a single bracketed "stage":

+
+textures/liquids/lava-example                   //Shader name
+{
+    deformVertexes wave sin 0 3 0 0.1           //General directive
+    q3map_tessSize 64                           //Q3Map2 directive
+    surfaceparm lava                            //Surface parameter directive
+    qer_editorimage textures/common/lava.tga    //Editor directive
+    {
+        map textures/common/lava.tga            //Stage directive
+    }
+}
+
+

Shaders need to be referenced by the map editor, compiler (Q3Map2) and game engine - each of which uses a different part of the shader. In the above example shader, the different sections are listed on the right.

+ +

Shader Name & File Conventions

+

The first line is the shader name. It is used by the map editor, compiler, game engine, and models to reference the script and art files associated with the shader. Shader names can be up to 63 characters long. The names are often a mirror of a pathname to the texture image without the file extension (.tga or .jpg) or base dir (/quake3/baseq3 in our case), but they do not need to be.

+

Shaders that are only going to be referenced by the game code, not modeling tools, often are just a single word, like "projectionShadow" or "viewBlood".

+

Shaders that are used on character or other polygon mesh models need to mirror the art files, which allows the modelers to build with normal textures, then have the special effects show up when the model is loaded into the game.

+

Shaders that are placed on surfaces in the map editor commonly mirror an image file, but the "qer_editorimage" shader parameter can force the editor to use an arbitrary image for display.

+

Shader path names have a case sensitivity issue - on Windows, they aren't case sensitive, but on Unix they are. Try to always use lowercase for filenames, and always use forward slashes "/" for directory separators.

+

Following the shader name, is an opening bracket "{" designating the beginning of the shader contents, and a closing bracket "}" at the end of the shader. Notice that the contents of the above example shader are indented for better legibility.

+ +

Key Concepts

+

Ideally, a designer or artist who is manipulating textures with shader files has a basic understanding of wave forms and knows about mixing colored light (high school physics sort of stuff). If not, there are some concepts you need to have a grasp on to make shaders work for you.

+ +

Surface Effects vs. Content Effects vs. Deformation Effects

+

Shaders not only modify the visible aspect of textures on a geometry brush, curve, patch or mesh model, but they can also have an effect on both the content, "shape," and apparent movement of those things. A surface effect does nothing to modify the shape or content of the brush. Surface effects include glows, transparencies and rgb (red, green, blue) value changes. Content shaders affect the way the brush operates in the game world. Examples include water, fog, nonsolid, and structural. Deformation effects change the actual shape of the affected brush or curve, and may make it appear to move.

+ +

Power Has a Price

+

The shader script gives the designer, artist and programmer a great deal of easily accessible power over the appearance of and potential special effects that may be applied to surfaces in the game world. But it is power that comes with a price tag attached, and the cost is measured in performance speed. Each shader phase that affects the appearance of a texture causes the Quake III engine to make another processing pass and redraw the world. Think of it as if you were adding all the shader-affected triangles to the total r_speed count for each stage in the shader script. A shader-manipulated texture that is seen through another shader-manipulated texture (e.g. a light in fog) has the effect of adding the total number of passes together for the affected triangles. A light that required two passes seen through a fog that requires one pass will be treated as having to redraw that part of the world three times.

+ +

RGB Color

+

RGB means "Red, Green, Blue". Mixing red, green and blue light in differing intensities creates the colors in computers and television monitors. This is called additive color (as opposed to the mixing of pigments in paint or colored ink in the printing process, which is subtractive color). In Quake III Arena and most higher-end computer art programs (and the color selector in Windows), the intensities of the individual Red, Green and Blue components are expressed as number values. When mixed together on a screen, number values of equal intensity in each component color create a completely neutral (gray) color. The lower the number value (towards 0), the darker the shade. The higher the value, the lighter the shade or the more saturated the color until it reaches a maximum value of 255 (in the art programs). All colors possible on the computer can be expressed as a formula of three numbers. The value for complete black is 0 0 0. The value for complete white is 255 255 255. However, the Quake III Arena graphics engine requires that the color range be "normalized" into a range between 0.0 and 1.0.

+ +

Normalization: a Scale of 0 to 1

+

The mathematics in Quake III Arena use a scale of 0.0 to 1.0 instead of 0 to 255. Most computer art programs that can express RGB values as numbers use the 0 to 255 scale. To convert numbers, divide each of the art program's values for the component colors by 255. The resulting three values are your Quake III Arena formula for that color component. The same holds true for texture coordinates.

+ +

Texture Sizes

+

TGA texture files are measured in pixels (picture elements). Textures are measured in powers of 2, with 16 x16 pixels being the smallest (typically) texture in use. Most will be larger. Textures need not be square, so long as both dimensions are powers of 2. Examples include: 32x256, 16x32, 128x16.

+ +

Color Math

+

In Quake III Arena, colors are changed by mathematical equations worked on the textures by way of the scripts or "programlets" in the shader file. An equation that adds to, or multiplies the number values in a texture causes it to become darker. Equations that subtract from or modulate number values in a texture cause it to become lighter. Either equation can change the hue and saturation of a color.

+ +

Measurements

+

The measurements used in the shaders are in either game units, color units, or texture units.

+
+
Game unit
A game unit is used by deformations to specify sizes relative to the world. Game units are the same scale we have had since way back in the Wolfenstein days - 8 units equals one foot. The default texture scale used by the Radiant map editor results in two texels for each game unit, but that can be freely changed.
+
Color units
Colors scale the values generated by the texture units to produce lighting effects. A value of 0.0 will be completely black, and a value of 1.0 will leave the texture unchanged. Colors are sometimes specified with a single value to be used across all red, green, and blue channels, or sometimes as separate values for each channel.
+
Texture units
This is the normalized (see above) dimensions of the original texture image (or a previously modified texture at a given stage in the shader pipeline). A full texture, regardless of its original size in texels, has a normalized measurement of 1.0 x 1.0. For normal repeating textures, it is possible to have value greater than 1.0 or less than 0.0, resulting in repeating of the texture. The coordinates are usually assigned by the level editor or modeling tools, but you still need to be aware of this for scrolling or turbulent movement of the texture at runtime.
+
+ +

Waveform Functions

+

Many of the shader functions use waveforms to modulate measurements over time. Where appropriate, additional information is provided with wave modulated directive functions to describe the effect of a particular waveform on that process. Currently there are five waveforms in use in Q3A shaders:

+
+
Sin
Sin stands for sine wave, a regular smoothly flowing wave function ranging from -1 to 1.
+
Triangle
Triangle is a wave with a sharp ascent and a sharp decay, ranging from 0 to 1. It will make choppy looking wave forms.
+
Square
A square wave simply switches from -1 to 1 with no in-between.
+
Sawtooth
In the sawtooth wave, the ascent is like a triangle wave from 0 to 1, but the decay cuts off sharply back to 0.
+
Inversesawtooth
This is the reverse of the sawtooth... instant ascent to the peak value (1), then a triangle wave descent to the valley value (0). The phase on this goes from 1.0 to 0.0 instead of 0.0 to 1.0. This wave is particularly useful for additive cross-fades.
+
Noise
Available for some functions only (rgbGen wave, but not alphaGen wave), adds a randomly changing value. The frequency value is (probably) hard-coded so changing it (probably) doesn't affect the speed of the flickering.
+
+

Waveforms all have the following properties:

+
+
base
Where the wave form begins. Amplitude is measured from this base value.
+
amplitude
This is the height of the wave created, measured from the base. You will probably need to test and tweak this value to get it correct for each new shader stage. The greater the amplitude, the higher the wave peaks and the deeper the valleys.
+
phase
This is a normalized value between 0.0 and 1.0. Changing phase to a non-zero value affects the point on the wave at which the wave form initially begins to be plotted. Example: In Sin or Triangle wave, a phase of 0.25 means it begins one fourth (25%) of the way along the curve, or more simply put, it begins at the peak of the wave. A phaseof 0.5 would begin at the point the wave re-crosses the base line. A phase of 0.75 would be at the lowest point of the valley. If only one wave form is being used in a shader, a phase shift will probably not be noticed and phase should have a value of zero (0). However, including two or more stages of the same process in a single shader, but with the phases shifted can be used to create interesting visual effects. Example: using rgbGen in two stages with different colors and a 0.5 difference in phase would cause the manipulated texture to modulate between two distinct colors. Phase changes can also be used when you have two uses of the same effect near each other, and you don't want them to be synchronized. You would write a separate shader for each, changing only the phase value.
+
freq
Frequency. This value is expressed as repetitions or cycles of the wave per second. A value of 1 would cycle once per second. A value of 10 would cycle 10 times per second. A value of 0.1 would cycle once every 10 seconds.
+
+ +

Special Case Syntax

+

There are a couple of special syntax types to be aware of that may be useful to shader artists.

+ +

Documenting With Comments

+

It is often useful to document parts of shaders, especially for testing purposes or when working with a development team of other designers. Comments added to shaders are ignored completely, making it useful for adding notes, or for temporarily removing directives for testing.

+

+Shaders use the same double forward slashes "//" convention common with many programming languages for commenting. All text after the "//" on the same line are ignored from the shader. Block comments such as "/* , */" from other programming languages do not work. See various shaders for examples.

+ +

:q3map Suffix

+

The :q3map suffix can be added to the end of the shader name of "compile-time" shaders. This means that shaders with names marked with :q3map will be used by the compiler only and will be ignored by the game engine. This is especially useful if you want to add Q3Map2-relevant shader directives to basic lightmapped textures. This allows Quake 3 to generate the stages implicitly while Q3Map2 processes the Q3Map2-relevant sections of the shader. Consider the following shaders:

+
+textures/q3map2_sm/floor
+{
+	surfaceparm metalsteps
+	{
+		map $lightmap
+		rgbGen identity
+	}
+	{
+		map textures/q3map2_sm/floor.tga
+		blendFunc GL_DST_COLOR GL_ZERO
+	}
+}
+
+

Normally, we wouldn't need a shader for this texture to be displayed properly in game since the lightmap and texture stages are generated implicitly by Quake 3. The only reason why this shader exists is because we want Q3Map2 to process this surface as having metalsteps when the player walks on it. As a result, we end up writing out the entire shader.

+

To save ourselves from needless work, we can mark this shader as being compiler-only and have Quake 3 generate the lightmap and texture stages for us as it usually does by default:

+
+textures/q3map2_sm/floor:q3map
+{
+	surfaceparm metalsteps
+}
+
+ +

Directive Types

+

Only the shader name is case sensitive (use all lowercase). Shader directives are not, but by convention, you should use mixedCase (ie. q3map_alphaMod). Some of the shader directives are order dependant, so it's good practice to keep all directive of a similar type grouped together in the following order, from top-down:

+ +

General Directives

+

A shader may contain general directives, which affects the shader's appearance globally (affects the entire shader), and changes the physical attributes of the surface that uses the shader. These attributes can affect the player. These parameters are executed at runtime, that is, in order to see the changes one does not need to re-compile the map.

+ +

Q3Map Directives

+

The general directives may be followed by Q3Map directives. These directives are used by the compiler to change the physical nature of the shader's surface and are also global.

+ +

Q3Map Surface Parameter Directives

+

These are actually part of the Q3Map directives that are flags telling the compiler about the physical nature of the shader's surface. These are also global.

+ +

Radiant Editor Directives

+

Radiant editor directives change the appearance of the shader in the map editor only. It has no effect on the shader in game.

+ +

Stage Specific Shader Directives

+

The shader may contain one or more "stages". Each stage consists of an opening and closing bracket along with the contents of the stage (indented). The stage will contain a texture map specification which specifies the source image, and various other stages specific shader directives that modifies the appearance of the source image. Stage specific directives are processed by the renderer. They are appearance changes only and have no effect on game play or game mechanics. Changes to any of these attributes will take effect as soon as the game goes to another level or vid_restarts (type command "/vid_restart" in the game console).

+ + + + \ No newline at end of file diff --git a/docs/shaderManual/sky01.jpg b/docs/shaderManual/sky01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..681947c0164859bdbe2a7352be43311202ac7951 GIT binary patch literal 18352 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 DN1Q3V literal 0 HcmV?d00001 diff --git a/docs/shaderManual/sky02.jpg b/docs/shaderManual/sky02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..83458bc23d2864e6673c8c4822074f0a0e92f1cc GIT binary patch literal 16242 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 literal 0 HcmV?d00001 diff --git a/docs/shaderManual/sky03.jpg b/docs/shaderManual/sky03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5eb89113bf690a81c80603bdeaf14e91b58e6b5 GIT binary patch literal 16147 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 literal 0 HcmV?d00001 diff --git a/docs/shaderManual/sky04.jpg b/docs/shaderManual/sky04.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5b7238f38dc6b372cde7c193f1e1896caf2e6fc4 GIT binary patch literal 16383 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 literal 0 HcmV?d00001 diff --git a/docs/shaderManual/sky05.jpg b/docs/shaderManual/sky05.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f35974f01fad00d9d9420e5ea1aa7d3bd68446e5 GIT binary patch literal 23805 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 Va3q`)f=pDq-u10*fuI*({s#ue3tj*K literal 0 HcmV?d00001 diff --git a/docs/shaderManual/stage-directives.html b/docs/shaderManual/stage-directives.html new file mode 100644 index 00000000..7dffdc39 --- /dev/null +++ b/docs/shaderManual/stage-directives.html @@ -0,0 +1,454 @@ + + + + + + Q3Map2 Shader Manual + + + + + + + + + +

Stage Directives

+

Stage specifications only affect rendering. Changing any directives or values within a stage will usually take effect as soon as a vid_restart is executed. Q3Map2 ignores stage directives entirely.

+

A stage can specify a texture map, a color function, an alpha function, a texture coordinate function, a blend function, and a few other rasterization options.

+ +

Texture Map Specification

+ +

map texturename

+

Specifies the source texture map (a 24 or 32-bit TGA or JPG file) used for this stage. The texture may or may not contain alpha channel information. The special keywords $lightmap and $whiteimage may be substituted in lieu of an actual texture map name. In those cases, the texture named in the first line of the shader becomes the texture that supplies the light mapping data for the process. The texture name should always end with the ".tga" suffix regardless of whether the source texture map is actually a .tga file or .jpg.

+ +

map $lightmap

+

This is the overall lightmap for the game world. It is calculated during the Q3Map2 process. It is the initial color data found in the framebuffer. Note: due to the use of overbright bits in light calculation, the keyword rgbGen identity must accompany all $lightmap instructions.

+ +

map $whiteimage

+

This is used for specular lighting on MD3 models. This is a white image generated internally by the game. This image can be used in lieu of $lightmap or an actual texture map if, for example, you wish for the vertex colors to come through unaltered.

+ +

clampMap texturename

+ +

Dictates that this stage should clamp texture coordinates instead of wrapping them. During a stretch function, the area, which the texture must cover during a wave cycle, enlarges and decreases. Instead of repeating a texture multiple times during enlargement (or seeing only a portion of the texture during shrinking) the texture dimensions increase or contract accordingly. This is only relevant when using something like deformTexCoordParms to stretch/compress texture coordinates for a specific special effect. Remember that the Quake III Arena engine normalizes all texture coordinates (regardless of actual texture size) into a scale of 0.0 to 1.0.

+

When using clampMap make sure the texture is properly aligned on the brush. The clampMap function keeps the image from tiling. However, the editor doesn't represent this properly and shows a tiled image. Therefore, what appears to be the correct position may be offset. This is very apparent on anything with a tcMod rotate and clampMap function.

+ +

Avoiding Distortion: When seen at a given distance (which can vary, depending on hardware and the size of the texture), the compression phase of a stretch function will cause a "cross"-like visual artifact to form on the modified texture due to the way that textures are reduced. This occurs because the texture undergoing modification lacks sufficient "empty space" around the displayed (non-black) part of the texture (see below, left). To compensate for this, make the non-zero portion of the texture substantially smaller (50% of maximum stretched size -- see below, right) than the dimensions of the texture. Then, write a scaling function (tcMod scale) into the appropriate shader phase, to enlarge the image to the desired proportion.

+ +

Figure 2a & 2b

+ +

The shaders for the bouncy pads (in the sfx.shader file) show the stretch function in use, including the scaling of the stretched texture:

+ +
+textures/sfx/metalbridge06_bounce
+{
+	//q3map_surfacelight 2000
+	surfaceparm nodamage
+	q3map_lightimage textures/sfx/jumppadsmall.tga
+	q3map_surfacelight 400
+	{
+		map textures/sfx/metalbridge06_bounce.tga
+		rgbGen identity
+	}
+	{
+		map $lightmap
+		rgbGen identity
+		blendfunc gl_dst_color gl_zero
+	}
+	{
+		map textures/sfx/bouncepad01b_layer1.tga
+		blendfunc gl_one gl_one
+		rgbGen wave sin .5 .5 0 1.5
+	}
+	{
+		clampmap textures/sfx/jumppadsmall.tga
+		blendfunc gl_one gl_one
+		tcMod stretch sin 1.2 .8 0 1.5
+		rgbGen wave square .5 .5 .25 1.5
+	}
+	// END
+}
+
+ +

animMap frequency texture1... texture8

+

The surfaces in the game can be animated by displaying a sequence of 1 to 8 frames (separate texture maps). These animations are affected by other keyword effects in the same and later shader stages.

+
+
frequency
The number of times that the animation cycle will repeat within a one second time period. The larger the value, the more repeats within a second. Animations that should last for more than a second need to be expressed as decimal values.
+
texture1... texture8
the texture path/texture name for each animation frame must be explicitly listed. Up to eight frames (eight separate .tga files) can be used to make an animated sequence. Each frame is displayed for an equal subdivision of the frequency value.
+
+
+

Example:

+

animMap 0.25 textures/sfx/b_flame1.tga textures/sfx/b_flame2.tga textures/sfx/b_flame3.tga textures/sfx/b_flame4.tga would be a 4 frame animated sequence, calling each frame in sequence over a cycle length of 4 seconds. Each frame would be displayed for 1 second before the next one is displayed. The cycle repeats after the last frame in sequence shown.

+
+
+textures/sfx/flameanim_blue
+{
+
+	//  ***********************************************
+	//  *    Blue Flame                               *
+	//  *    July 20, 1999 Surface Light 1800         *
+	//  *    Please Comment Changes                   *
+	//  ***********************************************
+	qer_editorimage textures/sfx/b_flame7.tga
+	q3map_lightimage textures/sfx/b_flame7.tga
+	surfaceparm trans
+	surfaceparm nomarks
+	surfaceparm nolightmap
+	cull none
+	q3map_surfacelight 1800
+	// texture changed to blue flame.... PAJ
+	{
+		animMap 10 textures/sfx/b_flame1.tga textures/sfx/b_flame2.tga
+			textures/sfx/b_flame3.tga textures/sfx/b_flame4.tga
+			textures/sfx/b_flame5.tga textures/sfx/b_flame6.tga
+			textures/sfx/b_flame7.tga textures/sfx/b_flame8.tga
+		blendFunc GL_ONE GL_ONE
+		rgbGen wave inverseSawtooth 0 1 0 10
+	}
+	{
+		animMap 10 textures/sfx/b_flame2.tga textures/sfx/b_flame3.tga
+			textures/sfx/b_flame4.tga textures/sfx/b_flame5.tga
+			textures/sfx/b_flame6.tga textures/sfx/b_flame7.tga
+			textures/sfx/b_flame8.tga textures/sfx/b_flame1.tga
+		blendFunc GL_ONE GL_ONE
+		rgbGen wave sawtooth 0 1 0 10
+	}
+	{
+		map textures/sfx/b_flameball.tga
+		blendFunc GL_ONE GL_ONE
+		rgbGen wave sin .6 .2 0 .6
+	}
+}
+
+
+

Design Notes:

+

To make a texture image appear for an unequal (longer) amount of time (compared to other frames), repeat that frame more than once in the sequence.

+
+ +

videoMap videoname

+

Surfaces marked with a shader containing this directive in one of its stages will display an animated video playing in a continuous loop. The video clip must be in ROQ format and playing at 30 frames per second. The ROQ file is stored in the "video" directory within the main mod directory. A third-party program is required to convert other video formats to the ROQ format for use within Quake III engine games.

+
+textures/obsidian_video/intro
+{
+	qer_editorImage textures/obsidian_video/qer_intro.tga
+	surfaceparm nolightmap
+	{
+		videoMap obsidian_intro.roq
+		rgbGen identity
+	}
+}
+
+ +
+

Historical Information:

+

The ROQ format is a proprietary video format developed by Graeme Devine originally used for "The 7th Guest" for the purpose of being able to decompress quickly while maintaining high image quality. It was later adopted by Id Software for use in Quake III Arena.

+
+ +

blendFunc func

+

Blend functions are the keyword commands that tell the Quake III Arena graphic engine's renderer how graphic layers are to be mixed together.

+ +

Simplified Blend Functions

+

The most common blend functions are set up here as simple commands, and should be used unless you really know what you are doing.

+
+
add
Shorthand command for blendFunc gl_one gl_one. Effects like fire and energy are additive.
+
filter
Shorthand command that can be substituted for either blendFunc gl_dst_color gl_zero or blendFunc gl_zero gl_src_color. A filter will always result in darker pixels than what is behind it, but it can also remove color selectively. Lightmaps are filters.
+
blend
Shorthand command for blendFunc gl_src_alpha gl_one_minus_src_alpha. This is conventional transparency, where part of the background is mixed with part of the texture.
+
+ +

Explicit Blend Functions

+

Getting a handle on this concept is absolutely key to understanding all shader manipulation of graphics.

+ +

blendFunc or "Blend Function" is the equation at the core of processing shader graphics. The formula reads as follows:

+ +
[source * (srcBlend)] + [destination * (dstBlend)]
+ +

Source is usually the RGB color data in a texture TGA file (remember it's all numbers) modified by any rgbGen and alphaGen. In the shader, the source is generally identified by command map, followed by the name of the image.

+ +

Destination is the color data currently existing in the frame buffer.

+ +

Rather than think of the entire texture as a whole, it maybe easier to think of the number values that correspond to a single pixel, because that is essentially what the computer is processing... one pixel of the bitmap at a time.

+ +

The process for calculating the final look of a texture in place in the game world begins with the precalculated lightmap for the area where the texture will be located. This data is in the frame buffer. That is to say, it is the initial data in the destination. In an unmanipulated texture (i.e. one without a special shader script), color information from the texture is combined with the lightmap. In a shader-modified texture, the $lightmap stage must be present for the lightmap to be included in the calculation of the final texture appearance.

+ +

Each pass or "stage" of blending is combined (in a cumulative manner) with the color data passed onto it by the previous stage. How that data combines together depends on the values chosen for the source blends and destination blends at each stage. Remember it's numbers that are being mathematically combined together that are ultimately interpreted as colors.

+ +

A general rule is that any source blend other than GL_ONE (or GL_SRC_ALPHA where the alpha channel is entirely white) will cause the source to become darker.

+ +

Source Blend (srcBlend)

+

The following values are valid for the source blend part of the equation.

+
+
GL_ONE
This is the value 1. When multiplied by the source, the value stays the same. The value of the color information does not change.
+
GL_ZERO
This is the value 0. When multiplied by the source, all RGB data in the source becomes zero (essentially black).
+
GL_DST_COLOR
This is the value of color data currently in the destination (frame buffer). The value of that information depends on the information supplied by previous stages.
+
GL_ONE_MINUS_DST_COLOR
This is nearly the same as GL_DST_COLOR except that the value for each component color is inverted by subtracting it from one. (i.e. R = 1.0 - DST.R, G = 1.0 - DST.G, B = 1.0 - DST.B, etc.)
+
GL_SRC_ALPHA
The TGA file being used for the source data must have an alpha channel in addition to its RGB channels (for a total of four channels). The alpha channel is an 8-bit black and white only channel. An entirely white alpha channel will not darken the source.
+
GL_ONE_MINUS_SRC_ALPHA
This is the same as GL_SRC_ALPHA except that the value in the alpha channel is inverted by subtracting it from one. (i.e. A=1.0 - SRC.A)
+
+ +

Destination Blend (dstBlend)

+

The following values are valid for the destination blend part of the equation.

+
+
GL_ONE
This is the value 1. When multiplied by the destination, the value stays the same the value of the color information does not change.
+
GL_ZERO
This is the value 0. When multiplied by the destination, all RGB data in the destination becomes zero (essentially black).
+
GL_SRC_COLOR
This is the value of color data currently in the source (which is the texture being manipulated here).
+
GL_ONE_MINUS_SRC_COLOR
This is the value of color data currently in source, but subtracted from one (i.e. inverted).
+
GL_SRC_ALPHA
The TGA file being used for the source data must have an alpha channel in addition to its RGB channels (four a total of four channels). The alpha channel is an 8-bit black and white only channel. An entirely white alpha channel will not darken the source.v GL_ONE_MINUS_SRC_ALPHA This is the same as GL_SRC_ALPHA except that the value in the alpha channel is inverted by subtracting it from one. (i.e. A=1.0 - SRC.A).
+
+ +

Doing the Math: The Final Result

+

The product of the source side of the equation is added to the product of the destination side of the equation. The sum is then placed into the frame buffer to become the destination information for the next stage. Ultimately, the equation creates a modified color value that is used by other functions to define what happens in the texture when it is displayed in the game world.

+ +

Default Blend Function

+

If no blendFunc is specified then no blending will take place. A warning is generated if any stage after the first stage does not have a blendFunc specified.

+ +

Technical Information/Limitations Regarding Blend Modes:

+

The Riva 128 graphics card supports ONLY the following blendmodes:

+
    +
  • GL_ONE, GL_ONE
  • +
  • GL_DST_COLOR, GL_ZERO
  • +
  • GL_ZERO, GL_SRC_COLOR
  • +
  • GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA
  • +
  • GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA
  • +
+

Cards running in 16 bit color cannot use any GL_DST_ALPHA blends.

+ +

rgbGen func

+

There are two color sources for any given shader, the texture file and the vertex colors. Output at any given time will be equal to TEXTURE multiplied by VERTEXCOLOR. Most of the time VERTEXCOLOR will default to white (which is a normalized value of 1.0), so output will be TEXTURE (this usually lands in the Source side of the shader equation). Sometimes you do the opposite and use TEXTURE = WHITE, but this is only commonly used when doing specular lighting on entities (i.e. shaders that level designers will probably never create.

+ +

The most common reason to use rgbGen is to pulsate something. This means that the VERTEXCOLOR will oscillate between two values, and that value will be multiplied (darkening) the texture.

+ +

If no rgbGen is specified, either "identityLighting" or "identity" will be selected, depending on which blend modes are used.

+ +

rgbGen identity

+

Colors are assumed to be all white (1.0, 1.0, 1.0). All filters stages (lightmaps, etc) will get this by default.

+ +

rgbGen identityLighting

+

Colors will be (1.0, 1.0, 1.0) if running without overbright bits (NT, Linux, windowed modes), or (0.5, 0.5, 0.5) if running with overbright. Overbright allows a greater color range at the expense of a loss of precision. Additive and blended stages will get this by default.

+ +

rgbGen vertex

+

Colors are filled in directly by the data from the map or model files. User rgbGen vertex + alphaGen const or rgbGen exactVertex to disable surfaces from being affected by alphaMod volumes. +

+

Design Notes:

+

rgbGen vertex should be used when you want the RGB values to be computed for a static model (i.e. mapobject) in the world using precomputed static lighting from Q3BSP. This would be used on things like the gargoyles, the portal frame, skulls, and other decorative models put into the Quake III Arena world.

+
+ +

rgbGen oneMinusVertex

+

As rgbGen vertex, but inverted. This keyword would probably not be used by a level designer.

+ +

rgbGen exactVertex

+

Like vertex, except exactVertex ignores overbrightbits. Generally brighter under default settings.

+ +

rgbGen fromVertex

+

(Pending)

+ +

rgbGen entity

+

Colors are grabbed from the entity's modulate field. This is used for things like explosions. This keyword would probably not be used by a level designer.

+ +

rgbGen oneMinusEntity

+

As rgbGen entity, but inverted.

+ +

rgbGen lightingDiffuse

+

Colors are computed using a standard diffuse lighting equation. It uses the vertex normals to illuminate the object correctly.

+
+

Design Notes:

+

rgbGen lightingDiffuse is used when you want the RGB values to be computed for a dynamic model (i.e. non-map object) in the world using regular in-game lighting. For example, you would specify on shaders for items, characters, weapons, etc.

+
+ +

rgbGen noise

+

(Probably doesn't exist)

+ +

rgbGen wave func base amplitude phase freq

+

Colors are generated using the specified waveform. An affected texture with become darker and lighter, but will not change hue. Hue stays constant. Note that the RGB values for color will not go below 0 (black) or above 1 (white). Valid waveforms are sin, triangle, square, sawtooth, inversesawtooth and noise (see Waveform Functions).

+ +

rgbGen const ( R G B )

+

A constant vertex colour is assigned to the affected surface. This modifies the hue of the texture.

+ +

alphaGen func

+

The alpha channel can be specified like the RGB channels. If not specified, it defaults to 1.0.

+ +

alphaGen lightingSpecular

+

alphaGen wave

+

alphaGen entity

+

alphaGen oneMinusEntity

+

alphaGen vertex

+

alphaGen oneMinusVertex

+ +

alphaGen const N.N

+

A constant vertex alpha is assigned to the affected surface. This modifies the transparency of the texture.

+ +

alphaGen portal

+

This rendering stage keyword is used in conjunction with the surface parameter keyword portal. The function accomplishes the "fade" that causes the scene in the portal to fade from view. Specifically, it means "Generate alpha values based on the distance from the viewer to the portal." Use alphaGen portal on the last rendering pass.

+ +

tcGen coordinateSource

+

Specifies how texture coordinates are generated and where they come from. Valid functions are base, lightmap, environment and vector.

+ +
+
base
Base texture coordinates from the original art.
+
lightmap
Lightmap texture coordinates.
+
environment
Projects a texture from environment mapping (typically used for shiny reflective surfaces like polished steel).
+
vector
Projects a texture from a specified direction.
+
+ +

tcGen vector ( sx sy sz ) ( tx ty tz )

+

New texture coordinate generation by world projection. This allows you to project a texture onto a surface in a fixed way, regardless of its orientation.

+ +

S-coordinates correspond to the "x" coordinates on the texture itself. T-coordinates correspond to the "y" coordinates on the texture itself. The measurements are in game units.

+ +

Example:

+

tcGen vector ( 0.01 0 0 ) ( 0 0.01 0 )
+

This would project a texture with a repeat every 100 units across the X/Y plane. The value comes from dividing the game units from 1, in this case, 1/100.

+ +

tcMod func

+

Specifies how texture coordinates are modified after they are generated. The valid functions for tcMod are rotate, scale, scroll, stretch, transform and turb. Transform is a function generally reserved for use by programmers who suggest that designers leave it alone. When using multiple tcMod functions during a stage, place the scroll command last in order, because it performs a mod operation to save precision, and that can disturb other operations. Texture coordinates are modified in the order in which tcMods are specified. In otherwords, if you see the following, the texture coordinates will be scaled, then scrolled.

+ +
+tcMod scale 0.5 0.5
+tcMod scroll 1 1
+
+ +

tcMod rotate degrees/sec

+

This keyword causes the texture coordinates to rotate. The value is expressed in degrees rotated each second. A positive value means clockwise rotation. A negative value means counterclockwise rotation. For example "tcMod rotate 5" would rotate texture coordinates 5 degrees each second in a clockwise direction. The texture rotates around the center point of the texture map, so you are rotating a texture with a single repetition, be careful to center it on the brush (unless off-center rotation is desired).

+ +

tcMod scale sScale tScale

+

Resizes (enlarges or shrinks) the texture coordinates by multiplying them against the given factors of sScale and tScale. The values "s" and "t"conform to the "x" and "y" values (respectively) as they are found in the original texture TGA. The values for sScale and tScale are NOT normalized. This means that a value greater than 1.0 will increase the size of the texture. A positive value less than one will reduce the texture to a fraction of its size and cause it to repeat within the same area as the original texture (Note: see clampTexCoords for ways to control this).

+ +

Example: tcMod scale 0.5 2 would cause the texture to repeat twice along its width, but expand to twice its height (in which case half of the texture would be seen in the same area as the original)

+ +

tcMod scroll sSpeed tSpeed

+

Scrolls the texture coordinates with the given speeds. The values "s" and "t" conform to the "x" and "y" values (respectively) as they are found in the original texture TGA. The scroll speed is measured in "textures" per second. A "texture" is the dimension of the texture being modified and includes any previous shader modifications to the original TGA). A negative s value would scroll the texture to the left. A negative t value would scroll the texture down.

+ +

Example: tcMod scroll 0.5 -0.5 moves the texture down and right (relative to the TGA files original coordinates) at the rate of a half texture each second of travel.

+ +

This should be the LAST tcMod in a stage. Otherwise there may be a popping or snapping visual effect in some shaders.

+ +

tcMod stretch func base amplitude phase frequency

+

Stretches the texture coordinates with the given function. Stretching is defined as stretching the texture coordinate away from the center of the polygon and then compressing it towards the center of the polygon. (see Chapter 1: Key Concepts for waveform parameter definitions).

+ +

tcMod transform m00 m01 m10 m11 t0 t1

+

Transforms each texture coordinate as follows:

+
+S' = s * m00 + t * m10 + t0
+T' = s * m01 + t * m11 + t1
+
+

This is primarily used by programmers.

+ +

tcMod turb base amplitude phase frequency

+

Applies turbulence to the texture coordinate. Turbulence is a back and forth churning and swirling effect on the texture.

+ +
+
base
Undefined
+
amplitude
This is essentially the intensity of the disturbance or twisting and squiggling of the texture.
+
phase
See the explanation for phase under the deformVertexes keyword.
+
frequency
Frequency. This value is expressed as repetitions or cycles of the wave per second. A value of one would cycle once per second. A value of 10 would cycle 10 times per second. A value of 0.1 would cycle once every 10 seconds.
+
+ +

depthFunc func

+

This controls the depth comparison function used while rendering. The default is "lequal" (Less than or equal to) where any surface that is at the same depth or closer of an existing surface is drawn. This is used for textures with transparency or translucency. Under some circumstances you may wish to use "equal", e.g. for light-mapped grates that are alpha tested (it is also used for mirrors).

+ +

depthWrite

+

By default, writes to the depth buffer when depthFunc passes will happen for opaque surfaces and not for translucent surfaces. Blended surfaces can have the depth writes forced with this function.

+ +

detail

+

This feature was not used in Quake III Arena maps, but still functions. Designates this stage as a detail texture stage, which means that if the c_var, r_detailtextures, is set to 0 then this stage will be ignored (detail will not be displayed). This keyword, by itself, does not affect rendering at all. If you do put in a detail texture, it has to conform to very specific rules. Specifically, the blendFunc:

+ +
+blendFunc GL_DST_COLOR GL_SRC_COLOR
+
+ +

This is also the simple blend function: blendFunc filter

+ +

And the average intensity of the detail texture itself must be around 127.

+ +

Detail is used to blend fine pixel detail back into a base texture whose scale has been increased significantly. When detail is written into a set of stage instructions, it allows the stage to be disabled by the c_var console command setting "r_detailtextures 0".

+ +

A texture whose scale has been increased beyond a 1:1 ratio tends not to have very high frequency content. In other words, one texel can cover a lot of real estate. Frequency is also known as "detail." Lack of detail can appear acceptable if the player never has the opportunity to see the texture at close range. But seen close up, such textures look glaringly wrong within the sharp detail of the Quake III Arena environment. A detail texture solves this problem by taking a noisy "detail" pattern (a tiling texture that appears to have a great deal of surface roughness) and applying it to the base texture at a very densely packed scale (that is, reduced from its normal size). This is done programmatically in the shader, and does not require modification of the base texture. Note that if the detail texture is the same size and scale as the base texture that you may as well just add the detail directly to the base texture. The theory is that the detail texture's scale will be so high compared to the base texture (e.g.; 9 detail texels fitting into 1 base texel) that it is literally impossible to fit that detail into the base texture directly.

+ +

For this to work, the rules are as follows:

+
    +
  • The lightmap must be rendered first. This is because the subsequent detail texture will be modifying the lightmap in the framebuffer directly.
  • +
  • The base texture must be rendered next.
  • +
  • The detail texture must be rendered last since it modifies the lightmap in the framebuffer. There is a bug in Quake III that disables all stages in a shader after a "detail" stage if r_detailTextures is set to 0.
  • +
  • The detail texture MUST have a mean intensity around 127-129. If it does not then it will modify the displayed texture's perceived brightness in the world.
  • +
  • The detail shader stage MUST have the "detail" keyword or it will not be disabled if the user uses the "r_detailtextures 0" setting.
  • +
  • The detail stage MUST use "blendFunc GL_DST_COLOR GL_SRC_COLOR". Any other BlendFunc will cause mismatches in brightness between detail and non-detail views.
  • +
  • The detail stage should scale its textures by some amount (usually between 3 and 12) using "tcMod scale" to control density. This roughly corresponds to coarseness. A very large number, such as 12, will give very fine detail, however that detail will disappear VERY quickly as the viewer moves away from the wall since it will be MIP mapped away. A very small number, e.g. 3, gives diminishing returns since not enough is brought in when the user gets very close. I'm currently using values between 6 and 9.5. You should use non-integral numbers as much as possible to avoid seeing repeating patterns.
  • +
  • Detail textures add one pass of overdraw, so there is a definite performance hit.
  • +
  • Detail textures can be shared, so designers may wish to define only a very small handful of detail textures for common surfaces such as rocks, etc.
  • +
+ +

An example (non-existent) detail shader is as follows:

+ +
+textures/bwhtest/foo
+{
+	q3map_globalTexture	//may be required when using tcMod scale in later stages
+
+	// draw the lightmap first
+	{
+		map $lightmap
+		rgbGen identity
+	}
+
+	// draw the base texture
+	{
+		map textures/castle/blocks11b.tga
+		blendFunc filter
+	}
+
+	// highly compressed detail texture
+	{
+		map textures/details/detail01.tga
+		blendFunc GL_DST_COLOR GL_SRC_COLOR	//MUST BE USED
+		detail	//allows detail shaders to be disabled
+		tcMod scale 9.1 9.2
+	}
+}
+
+ +

alphaFunc func

+ +

Determines the alpha test function used when rendering this map. Valid values are GT0, LT128, and GE128. These correspond to "GREATER THAN 0", "LESS THAN 128", and "GREATER THAN OR EQUAL TO 128". This function is used when determining if a pixel should be written to the framebuffer. For example, if GT0 is specified, the only the portions of the texture map with corresponding alpha values greater than zero will be written to the framebuffer. By default alpha testing is disabled.

+ +

Both alpha testing and normal alpha blending can be used to get textures that have see-through parts. The difference is that alphaFunc is an all-or-nothing test, while blending smoothly blends between opaque and translucent at pixel edges. Alpha test can also be used with depthWrite, allowing other effects to be conditionally layered on top of just the opaque pixels by setting depthFunc to equal.

+ + + \ No newline at end of file diff --git a/docs/shaderManual/terrain-and-alphamod-blends.html b/docs/shaderManual/terrain-and-alphamod-blends.html new file mode 100644 index 00000000..6be19461 --- /dev/null +++ b/docs/shaderManual/terrain-and-alphamod-blends.html @@ -0,0 +1,122 @@ + + + + + + Q3Map2 Shader Manual + + + + + + + + + +

Terrain

+

Q3Map2 terrain has changed radically since Quake III: Team Arena first hit the shelves. Alphamapped terrain shaders are difficult to set up, limiting and lacks the ability for the mapper to fine tune the effect. The new terrain improvements in Q3Map2 have removed these difficulties, allowing the mapper to fully exploit terrain shaders for breathtaking outdoor scenes. This section will assume that you are already familiar with the method of setting up a standard alphamapped terrain as described in the Terrain Construction for Quake 3 Engine Games manual by Paul Jaquays, and will focus on the new enhanced features of Q3Map2 terrain.

+ +

General Changes

+

Q3Map2 terrain has changed dramatically in terms of not only visually, but also in terms of how it is processed by the compiler. To ensure compatibility, there needs to be a few changes. Foremost, make sure that all terrain shader files are listed in the shaderlist.txt file.

+ +

Before using Q3Map2 alphamapped terrain, it must be noted that terrain is now handled completely different than before. Q3Map2 no longer looks for the word terrain in the shader name to determine whether or not it is an indexed shader. Instead it looks for q3map_indexed or q3map_terrain. For this reason, the alphamap terrain shaders have been slightly modified. If using Q3Map2 alphamaps, make sure that your "textures/common/terrain" and "textures/common/terrain2" shaders have been updated to the following:

+ +
+textures/common/terrain
+{
+	q3map_terrain
+	surfaceparm nodraw
+	surfaceparm nolightmap
+	surfaceparm nomarks
+}
+
+textures/common/terrain2
+{
+	q3map_terrain
+	qer_editorimage textures/common/terrain.tga
+	surfaceparm dust
+	surfaceparm nodraw
+	surfaceparm nomarks
+	surfaceparm nolightmap
+}
+
+ +

Base Shader

+

To simplify the terrain shader writing process, a base shader can be used as a template with subclassed shaders referencing it. This makes use of the q3map_baseShader directive. The base shader can consist of all q3map_* directives and must be processed before all other terrain shaders referencing it. The use of a base shader is recommend for all terrain shaders.

+ +

tcMod Functions

+

q3map_tcMod can be used on terrain shaders to minimize any obvious texture tiling, particularly q3map_tcMod rotate. In some situations q3map_tcMod scale or the stage driven tcMod scale may be used to scale the textures - though typically tcGen texture projection functions are usually the preferred method.

+ +

tcGen Functions

+

In most situations, terrain textures will need to be projected onto the terrain mesh. This is achieved by using either q3map_tcGen function or the stage specific tcGen. Any tcGen functions will overwrite any tcMod scale functions.

+ +

Lightmapped Terrain

+

The foremost improvement to Q3Map2 terrain is the ability to use lightmaps as a lighting system rather than basic vertex lighting. This allows terrain to not only cast detailed shadows onto itself, but also allows other map geometry to cast shadows onto the terrain as well. The additional rendering pass of the lightmap creates a slight performance hit as a price for the improved visuals. Several new q3map_* directives are typically used to tweak the terrain lightmap:

+ +

q3map_nonPlanar

+

Required on all terrain shaders, q3map_nonPlanar allows shadows to be cast across non-planar edges. This fixes a problem where lightmapped terrain would not light properly across uneven surfaces.

+ +

q3map_lightmapAxis

+

Optionally used, q3map_lightmapAxis can be used to specify the axis in which the lightmap is projected from. This is typically used on normal triangle-quad souped terrain and is set implicitly to "q3map_lightmapAxis z" with q3map_terrain. It is not recommended for terrain with caves or undersides.

+ +

q3map_shadeAngle

+

Most terrain artists will choose to enable triangle edge shadow smoothing to reduce the appearance of sharp shadow edges across the terrain mesh. q3map_shadeAngle specifies the triangle edge angle at which the light will be diffused. For best results, it is recommended that you start with low values and tweak the angle parameter in small increments until a satisfactory result is produced. Overly high values will wash out shadow details.

+ +

q3map_lightmapMergable

+

Setting q3map_lightmapMergable merges all terrain into one seamless lightmap, reducing the appearance of artifacts spanning across separate lightmap images.

+ +

q3map_lightmapSampleSize

+

Lightmapped terrain can be very memory intensive as Q3Map2 has to typically generate a large amount of lightmap data. q3map_lightmapSampleSize can be used to reduce the amount of lightmap memory used by limiting the resolution of the lightmap images. Similarly, it can also be used to increase the lightmap resolution at the cost of memory.

+ +

q3map_lightmapSampleOffset

+

If experiencing lightmap splotches over the surface of terrain lightmaps, q3map_lightmapSampleOffset can be used to fix this. For best results, start with small numbers (default 1.0) and slowly increase this value until the splotches disappear. Overly high values will cause unsatisfactory results.

+ + +

AlphaMod Dotproduct Terrain

+

AlphaMod dotproduct terrain is a revolutionary way in which Q3Map2 terrain is blended. It removes the need for an alphamap and metashader and automatically determines the blending of terrain depending on the vertex normals of the terrain mesh. Equally important, this new system removes the need of a triangle-quad grid, allowing the designer to create a terrain mesh using any triangle shape or size.

+ + +

AlphaMod Volume Terrain

+

Following the automatic generation of dotproduct blending, alphaMod volume terrain blending was developed to give direct control of the alpha blending back to the designer. Using this system the designer can modify the exact location and amount of blending to occur, directly from within the editor.

+ + + \ No newline at end of file diff --git a/docs/shaderManual/texture-creation.html b/docs/shaderManual/texture-creation.html new file mode 100644 index 00000000..fc344785 --- /dev/null +++ b/docs/shaderManual/texture-creation.html @@ -0,0 +1,109 @@ + + + + + + Q3Map2 Shader Manual + + + + + + + + + + +

Texture Creation

+

If you are familiar with the required tools, creating new assets for use in Quake III Arena is not particularly difficult. As a general rule, you should create new directories for each map with names different from the names used by id. If you are making a map that will be called "H4x0r_D00M", every directory containing new assets for that map should be titled H4x0r_D00M. This is to try and avoid asset directories overwriting each other as the editor and the gameload in assets.

+ +

Tools Needed

+

Any combination of graphic programs and plug-ins that canout put a 24 bit MS windows compatible Targa (.tga) or JPEG (.jpg) graphic file.If you plan to make textures that will have an alpha channel component (a 4th 8-bit greyscale channel that is used by the shaders to further manipulate the art), you must have a program that can create 32-bit art with that fourth channel.

+

Adobe Photoshop has the ability to easily create alpha channels. PaintShop Pro from Corel (v5.0+) can also make an alpha channel by creating a mask and naming it "alpha". Free and open source GIMP also works quite well.

+

Generally speaking, regardless of the program used, we found it best to do most of the art manipulation of the alpha channel in a separate layer or file and then paste it into the alpha channel before saving.

+ +

Setting up Files

+

The editor and the game program look for assets to be located along the paths set up in your project file. Start by creating a directory for you new textures by creating file folders to make a directory path as follows:

+
+quake3\baseq3\textures\[mymapname]
+
+

The installation of Q3Radiant will create a text document called "shaderlist.txt" in the following path:

+
+quake3\baseq3\scripts\shaderlist.txt
+
+

Q3Radiant will use the contents of this script to grab your new textures for inclusion in the game. The contents of shaderlist.txt document will contain a listing of all the shader documents that were used by id Software to create Quake III Arena.

+

Since you will obviously want to create your own shaders, you need to put them in separate folders and create a new shader script for them.

+

If you plan to work on several maps at once and want to distinguish between textures used in each map, simply add additional map names here. For map and mod makers, we STRONGLY recommend that any new shader scripts created use the name of the map or mod in the shader file name. We know we can't avoid every incident of files overwriting each other, but we certainly can advise you how to try.

+

Now, in the scripts directory that you just created, create another text file and call it:

+
+[mymapname].shader
+
+

This file will contain the shader scripts you write to modify a particular texture.

+

Rules and Guidelines

+

Follow these rules when creating textures for the Quake III Arena engine:

+
    +
  • Save your textures into your new [map name] directories.
  • +
  • Don't use the same names that id used for textures. It will cause problems.
  • +
  • For best quality, save textures without an alpha channel as 24 bit TARGA files. Using JPEG files can save memory space, but at the risk of losing detail and depth in the texture. JPEG files cannot be used for textures requiring an alpha channel.
  • +
  • Textures containing an alpha channel must be saved as32 bit TARGA files.
  • +
  • If a new texture requires no further manipulation, it does not need a shader script.
  • +
  • Size textures in powers of 2. Example: 8x8, 16x16,32x32, 64x64 pixels and so on.
  • +
  • Textures don't need to be square. A 32x256 pixel texture is perfectly acceptable.
  • +
+

The following are some things the id designers learned about textures.

+
    +
  • Create textures in "suites" built around one or two large textures with a number of much smaller supporting detail or accent textures.
  • +
  • Very large textures are possible, but some video cards compress textures larger than 256x256 pixels.
  • +
  • Textures are grouped alphabetically by name in the texture display window, so you may want to give suites of textures similar names.
  • +
  • Use the shader function qe3_editorimage to conserve memory when making multiple versions of a single texture (as in the case of a glowing texture with several light values).
  • +
  • Unless you are creating special effects or textures designed to draw the player's eye to a specific spot, muted, middle value colors work best with the game engine.
  • +
  • Extremely busy (a lot of fussy detail) textures can break up or form visually unpleasant patterns when seen at distances.
  • +
+ +

Making the .pk3 File

+

When you go to distribute your creation to the gaming world, you need to put your newly created map, textures, bot area files, and shader documents into an archive format called a "pk3" file. You do not need to include the shaderlist.txt file, since that is only used by the editor. You will need to keep the paths to the various assets the same. So your paths should be something like this:

+
+Textures: baseq3/textures/[mymapnamefolder]
+Bsp & aas: baseq3/maps/mymapname.bsp, mymapname.aas
+Shader scripts: baseq3/scripts/mymapname.shader
+
+

You need to use a "zip" archiving program (7-zip for example) to make the pk3 file. Make a zip archive called mymapname.zip. Zip all the required assets into a zip archive file (Quake III Arena DOES support compressed pk3 files). Rename the zip archive to mymapname.pk3. Put it where the Quake III Arena community can find it.

\ No newline at end of file diff --git a/docs/shaderManual/title.gif b/docs/shaderManual/title.gif new file mode 100644 index 0000000000000000000000000000000000000000..c793178fb1962d3d277151ad470a4ae248983c1c GIT binary patch literal 2526 zcmV<42_g1JNk%w1VQ2w10M!5h|NsBLzrO$g0N>x=@9*zFKR?gU&o3`8e}8{pUtf=p zkHf>m$H&L__xI=L=iA%c^Yio5)6>h#%h%V}`}_L~3k&P(>$9`74-XIHCc%pP#Ru^XM|QCt2L~tx#2C2-0EYn* z2F=c~8o|=jB+EvJ2dW(-G}8wisv~RJ5K(8O&ZbyM+1#4vCKg9aZomon zK+lbcSSvfKO4sJXhj@9sKhYmIi`0 zDQ=_GNaDqc3kz||Mlt|WcN7`ggbY9gJLsM$lN4bHW<*&at6uZguY6G*Paq$&r(qRNI3 zKJgwR3_J%waSkx(BoPicpr#YmH6q!H0lWi1osGmtmYqZt7(kdx2%1?DhPpv06`Sb! zgaeJ0DQOhj?J?=4m}aW!rkr-_>8GHED(a}DmTKy$sHUpws;q)~9(QhpHUtH*CSpXQ zi1;}KpYr9-F5ZFvfb$-wAOD3DS&E zL%<~XXXy~_v>`2^N<_@YTMooCFd+lrGvGdr7(jpt!~kaSCd8P)%K#RyA&n#(*o&UK z1(@6f0TOcbFEQReVSkT=z1TA7d?rfkW? zmktSt0oFy6NyPvPB#>7T`(gMB5*`%++*v@|oMRg~p-4p3{$j4m42^Ck(g*&jtwBi+ zBO+_BlRc&XN>l-;z128Hf^5eKK%1D^bWkqowg6hmBDerxOAxGA|>rqLC7 zEaL$^Lw|YWv;Zl*8|yHjRRu15&IZsmYfD7%f!`UDPb*O z5YamT2uge>7}OC6aF<<}?m~l5fZG@c6zXND02DMpEJ}APm0V9oj+>O&l4Xa|5MgSy z@>8YqRD`bmheSH^-5a1Vz(JT$hIi=RLr91oW|_ePfq<0+9`L*)n4?w;m_QMU;KDUH z>Q@&l0%8=y0{pBYQcXBbBNhMwWDPXSnlVJ&ZXvRe8{ zKac@X3nA%*8a6_hNswEu!c?vl;_?WVY{LRP$;8wRfh|#hBKbC>8eM6#Y)n9;VlsII zWh&5!2^xaPra-$(8DKE*l*ucx(98h1ZxhB^PYgAQN+Yx^GE5MZAav3dJ1kKFG9i;W z!7;Wt|OJg1zG}AI1X%zq~Ol3}f5xW#@uz==V zK|b(-fCj{purrDs;FQN!$;Ju*Z(V{&z9aza;iRlr_{u~vU^)2ZH98tl1yxZHy^DfQ zD585`J`}5pXiS5udmv{r=4T>P)TsoV16u$dP{Yt@6;G+0D^e_!fC~gSNi3NEt4a}} z6{>1Q9Fmv-)6UBu+^uyGR~i>=i@O8@;A0m4{Yw)vCx*)XR4x>n5P{Vx6}OSVBp?vU z;*NUU!lr1sgK~z3V-W*yKz9w(R2}>ZdWT50^Qr~8-P|rh)dqle5N#8RNfe-!4jgl? zWbsfeMsR`q64kXJeqL;QA)+>T@V0cN0$I}or2~KO!bxVZ*CrY!rzJNX_?YnZ6qC=a z(N74jQ|(Cyd(&MhX0amCKKDI*(RI!2wWWY~DE<)5~ zq~)MqVE_|Nh~)&^)hG`&vK9CniX5P}7m#^<@bhV4d}~h;S9e#DRYd~(2cf54eUq@b zV;hNAyWTb+sXxmit5KB;K|APJ6N}Fu(&s@rTo1`-JW&g1cu( zVQ>P#+H8>35|+INeJ?aM@nv@?g2+p754D!2toJ6d^=>mea$D-b_ZpD71Y`qi2+?E% z8TE;9eH&Z|zY(K@>Zuw|BF7CImn0%6F3v$v0Ho4Q0!Z(G4t^7?+ok+C6JXkwp8K2t oEgJvuID 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

P~uiFYdOg@NF_dn{ITupk0kng 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 Yof#)3D}%{<(;? + + + + + Q3Map2 Shader Manual + + + + + + + +

+ +

Triggerable Shader Entities

+

The targetShaderName and targetShaderNewName keys can be used with any entity that supports the target key (the entity instance does not actually have to use the target key for these new keys to work). If both are defined, then when the entity decides to activate its targets, all shaders/textures in the map that were originally the same name as the targetShaderName value, will be changed to the targetShaderNewName value. +For example this would make it look like the red light shader is "turning on":

+ +
+"targetShaderName" "textures/proto2/redlight_off"
+"targetShaderNewName" "textures/proto2/redlight_on"
+
+ +

And this would turn it back off:

+ +
+"targetShaderName" "textures/proto2/redlight_off"
+"targetShaderNewName" "textures/proto2/redlight_off"
+
+ +

Note that the ORIGINAL shader name is used in both instances, not whatever it happens to be currently. Also, of course, this will happen globally. If the mapper wanted to affect only a certain set of red lights, he/she would need to make a unique shader name to be used with that set.

+ +

The code that supports these keys is in G_UseTargets in g_utils.c

+ +

-TTimo, 31.08.01

+ + + \ No newline at end of file