{"id":1610,"date":"2024-01-20T14:16:16","date_gmt":"2024-01-20T14:16:16","guid":{"rendered":"https:\/\/www.katsbits.com\/site\/?p=1610"},"modified":"2024-01-20T17:24:42","modified_gmt":"2024-01-20T17:24:42","slug":"map-extras","status":"publish","type":"post","link":"https:\/\/www.katsbits.com\/site\/map-extras\/","title":{"rendered":"Map &#8211; Extras (#7)"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_80 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.katsbits.com\/site\/map-extras\/#Shader_texture_path_problems\" >Shader &amp; texture path problems<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.katsbits.com\/site\/map-extras\/#Checking_the_map_file_data\" >Checking the .map file data<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.katsbits.com\/site\/map-extras\/#Small_details_and_models\" >Small details and models<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.katsbits.com\/site\/map-extras\/#Planar_coplanar_surfaces\" >Planar &amp; coplanar surfaces<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.katsbits.com\/site\/map-extras\/#Mitring_corners_or_not\" >Mitring corners, or not<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.katsbits.com\/site\/map-extras\/#Misc_activating_the_MAP_AddOn\" >Misc. activating the MAP AddOn<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.katsbits.com\/site\/map-extras\/#Misc_map_entity_kit\" >Misc. map entity kit<\/a><\/li><\/ul><\/nav><\/div>\n<p>There are a number of additional extras that can help with the production of .map based levels or further our understanding of what we&#8217;re doing using Blender in this capacity.<\/p>\n<p>In this following final chapter we&#8217;ll take a look at a variety of these as well as look at some of the more frequent and common problems that happen when designing with Blender.<\/p>\n<blockquote style=\"background-color: #ddecf3; color: #000;\"><p><strong>Download<\/strong>: <a title=\"Tutorial srouce files (ZIP)\" href=\"https:\/\/www.katsbits.com\/files\/tutorials\/katsbits_map-blender-source.zip\">KatsBits &#8211; Map Source<\/a> (c. 10 MB | *.blend, *.map, *.obj, *.mtl, *.jpg,).<\/p><\/blockquote>\n<blockquote class=\"menu_resources\"><p><strong>Resources<\/strong><br \/>\n&#8211; <a title=\"Download the Blender .map Entity Helper Kit\" href=\"https:\/\/www.katsbits.com\/site\/radiant-entity-blender\/\">Blender Entity Helper Kit<\/a><br \/>\n&#8211; <a title=\"Making .maps with Blender 2.49\" href=\"https:\/\/www.katsbits.com\/site\/exporting-models-as-bsp-maps\/\" target=\"_self\" rel=\"noopener\">Blender 2.49 .map making<\/a><br \/>\n&#8211; <a title=\"Quake III editing manual\" href=\"http:\/\/robotrenegade.com\/radiant\/manual\/index.htm\" target=\"_blank\" rel=\"noopener\">Quake III Manual<\/a><br \/>\n&#8211; <a title=\"Download GTK Radiant\" href=\"http:\/\/radiant.robotrenegade.com\/\" target=\"_blank\" rel=\"noopener\">GtkRadiant download<\/a><\/p><\/blockquote>\n<p><a id=\"shaderpaths\" name=\"shaderpaths\"><\/a><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Shader_texture_path_problems\"><\/span>Shader &amp; texture path problems<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>When <a title=\"Material assignments to .map based levels\" href=\"https:\/\/www.katsbits.com\/site\/map-materials\/\" target=\"_self\" rel=\"noopener\">creating the materials<\/a> assigned to the various mesh objects used to build the level, each was composed of three basic &#8216;stages&#8217; or &#8216;slots&#8217; &#8211; a &#8220;<b>Material<\/b>&#8221; stage, a &#8220;<b>Texture<\/b>&#8221; stage and an &#8220;<b>Image<\/b>&#8221; stage. For .map based level editing the image stage is of more importance than the other two because the data it contains is used to determine the &#8220;<b>Shader<\/b>&#8221; &#8216;path&#8217; that&#8217;s subsequently assigned to exported brush volumes.<\/p>\n<p>When we add a bitmap image to a &#8220;<b>Texture<\/b>&#8221; slot it generates two pieces of data; 1) the images &#8220;<b>Source:<\/b>&#8221; data &#8211; this is the physical location of the bitmap asset and appears in the &#8220;<b>Source:<\/b>&#8221; input field<sup>[2]<\/sup> as either a &#8216;full&#8217; or &#8216;truncated&#8217; file path depending on how the asset is referenced, i.e. &#8220;<b>F:\\Models\\TUTORIALS\\test1.jpg<\/b>&#8221; or &#8220;<b>\\\\..\/test1.jpg<\/b>&#8221; respectively. And 2) the &#8220;<b>Image Name ID<\/b>&#8221; of the datablock &#8211; this is usually taken from the assets file name (in this instance that&#8217;s &#8220;test1.jpg&#8221;). It&#8217;s also an independent block of data that identifies the image so different materials can use the same image but be referenced separately (different &#8216;name&#8217;, same &#8216;image&#8217;).<\/p>\n<p>For the purposes of .map based design the file path present in the &#8220;<b>Source:<\/b>&#8221; datablock is important because the export process uses this as a means to generate the shader names assigned to brush volumes. It does this by stripping out the &#8216;path&#8217; aspect of the source, &#8220;<b>F:\\Models\\TUTORIALS\\<\/b>&#8221; for example, leaving just the file name, &#8220;<b>test1.jpg<\/b>&#8220;. This is further stripped of the file extension, &#8220;<b>.jpg<\/b>&#8221; in this instance, the remainder, &#8220;<b>test<\/b>&#8220;, being the temporary &#8216;shader&#8217; applied to the exported map data.<\/p>\n<div class=\"content_images\">\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-textures-settings.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Shader path details are derived from &quot;Source:&quot; path data\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-textures-settings_sml.jpg\" alt=\"Shader path details are derived from &quot;Source:&quot; path data\" width=\"640\" height=\"400\" border=\"0\" \/><\/a><\/p>\n<p>Shader references are determined in Blender from an images &#8220;<b>Source:<\/b>&#8221; data, which tends to produce &#8216;broken&#8217; shader assignments. Character length restrictions mean not being able to add custom (correctly formatted) text to the &#8220;<b>Image Name ID<\/b>&#8221; datablock (above &#8220;Source:&#8221;)<sup>[2]<\/sup><\/p>\n<\/div>\n<p>This presents a problem however. Shaders are not physical bitmap assets, they are simply &#8220;<b>name<\/b>&#8221; references or &#8220;<b>ID<\/b>&#8221; tags. This means using Blenders image &#8216;source&#8217; data to determine shader references will <b><i>always<\/i> produce broken paths<\/b> because they are not formatted relative to what the .map environment is expecting. Below is a typical shader. It&#8217;s &#8216;ID&#8217; when assigned to a surface is &#8220;<b>spkat5\/gunmetal3<\/b>&#8220;<sup>[1]<\/sup>, whereas the actual texture asset is called &#8220;<b>xgrid_c01.tga<\/b>&#8220;<sup>[2&amp;3]<\/sup>.<\/p>\n<blockquote style=\"background-color: #e7faea; color: #000;\"><p>textures\/spkat5\/<b>genmetal3<\/b><sup>[1]<\/sup><br \/>\n{<br \/>\nsurfaceparm nonsolid<br \/>\n<b class=\"hierarchylvl2\">qer_editorimage textures\/xlab_props\/xgrid_c01.tga<\/b><sup>[2]<\/sup><br \/>\nq3map_forceMeta<br \/>\nq3map_nonPlanar<br \/>\n\/\/ q3map_shadeAngle 10<br \/>\n{<br \/>\n<b class=\"hierarchylvl1\">map textures\/xlab_props\/xgrid_c01.tga<\/b><sup>[3]<\/sup><br \/>\nrgbGen vertex<br \/>\n}<br \/>\n}<\/p><\/blockquote>\n<p>We can work around this problem to a certain extent using placeholder textures named the same as the shader &#8220;ID&#8221; we want to use in game, &#8220;<b>gunmetal3.tga<\/b>&#8221; for example, instead of the assets actual name &#8220;<b>xgrid_c01.tga<\/b>&#8220;. This at least makes it easier to figure out, after-the-fact, which shader we were actually referencing in Blender, allowing a quick &#8216;find &amp; replace&#8217; in the level editor. The alternative is to extract the contents of a particular game and use the assets &#8216;as is&#8217; for <b>visual reference<\/b>, we then just match the shader to the texture seen in Blender.<\/p>\n<div class=\"content_images\">\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-extras-editor-shader-names.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Shaders applied to surfaces in Radiant\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-extras-editor-shader-names_sml.jpg\" alt=\"Shaders applied to surfaces in Radiant\" width=\"640\" height=\"400\" border=\"0\" \/><\/a><\/p>\n<p>If we know the name of the shader we can use a placeholder similarly named in Blender so we know which shader we were actually referencing from a given game, in this instance &#8220;<b>awall_m06<\/b>&#8221; and &#8220;<b>afloor_m01<\/b>&#8221; (pulled from Return to Castle Wolfenstein, single player)<\/p>\n<\/div>\n<p><a id=\"checkmap\" name=\"checkmap\"><\/a><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Checking_the_map_file_data\"><\/span>Checking the .map file data<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Under most circumstances the objects we export from Blender are properly converted so the resulting file, if opened into a plain text editor, is not too dissimilar to the below. Occasionally there are problems that basically manifest themselves as &#8216;invisible&#8217; maps &#8211; files open but contain no data. The typical cause of this is a missing &#8216;shader&#8217; reference in the file<sup>[2]<\/sup>. Although coordinate data for a given element can be present (data that pertains to the physical dimensions or location of an object or element)<sup>[1]<\/sup>, without a shader reference the data block is incomplete so the level editor interprets the file as being &#8216;broken&#8217; when loaded, resulting in a &#8216;blank&#8217; scene. We can fix this problem by re-exporting the level from Blender, making sure to check texture assignments beforehand. Or we use a text editor to &#8216;<b>find &amp; replace<\/b>&#8216; missing references.<\/p>\n<blockquote style=\"background-color: #e7faea; color: #000;\"><p>\/\/ brush from cube<br \/>\n{<br \/>\n<span class=\"hierarchylvl1\">( 128.00012207 -632.00000000 -128.00000000 ) ( 127.99989319 -632.00000000 128.00000000 ) ( 63.99974823 -640.00000000 128.00000000 )<\/span><sup>[1]<\/sup> <b>test1<\/b><sup>[2]<\/sup> <span class=\"hierarchylvl3\">0 0 0 1 1 0 0 0<\/span><sup>[3]<\/sup><\/p>\n<p>( 64.00000000 -704.00000000 128.00000000 ) ( 127.99989319 -704.00000000 128.00000000 ) ( 128.00012207 -704.00000000 -128.00000000 ) NULL 0 0 0 1 1 0 0 0<\/p>\n<p>( 64.00009918 -640.00000000 -128.00000000 ) ( 64.00000000 -704.00000000 -128.00000000 ) ( 128.00012207 -704.00000000 -128.00000000 ) NULL 0 0 0 1 1 0 0 0<\/p>\n<p>( 127.99989319 -632.00000000 128.00000000 ) ( 128.00012207 -632.00000000 -128.00000000 ) ( 128.00012207 -704.00000000 -128.00000000 ) NULL 0 0 0 1 1 0 0 0<\/p>\n<p>( 127.99989319 -632.00000000 128.00000000 ) ( 127.99989319 -704.00000000 128.00000000 ) ( 64.00000000 -704.00000000 128.00000000 ) NULL 0 0 0 1 1 0 0 0<\/p>\n<p>( 63.99974823 -640.00000000 128.00000000 ) ( 64.00000000 -704.00000000 128.00000000 ) ( 64.00000000 -704.00000000 -128.00000000 ) NULL 0 0 0 1 1 0 0 0<br \/>\n}<\/p><\/blockquote>\n<p><a id=\"detailsmodels\" name=\"detailsmodels\"><\/a><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Small_details_and_models\"><\/span>Small details and models<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Making .map based levels necessitates working within certain size limitations we shouldn&#8217;t typically go under for generally placed architectural structures, the smallest objects being &#8220;8&#8221; unit steps or stairs. What happens if we have or want to place objects that are smaller than this? Objects that are relatively complex? Or other items we may want to distribute frequently around a level?. Under these circumstances we rely on normal models exported to an editor\/game friendly format. It&#8217;s beyond the scope of this tutorial to discuss making models specifically, suffice to say here that we have two options for getting such content out of Blender and into a level; we can export all the smaller details and objects as a single joined mesh, or rely on a single instance and its subsequent replication and placement in the level editor.<\/p>\n<div class=\"content_images\">\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-optimise-small-models.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Export small details as models\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-optimise-small-models_sml.jpg\" alt=\"Export small details as models\" width=\"640\" height=\"400\" border=\"0\" \/><\/a><\/p>\n<p>Small details or objects that are used frequently should ideally be exported as models and not brush volumes. They can be processed as a larger group (all items joined together into a larger object), or as a single item which is re-placed in the level editor <b class=\"blenderFileRef\">[see *.blend &#8220;44&#8221;]<\/b><\/p>\n<\/div>\n<p>In practice using a joined group, where all the models placed in the level are joined together into one much larger object (or joined together based on object types), means we can do much of the detailing work in Blender, everything then being exported as a single entity that just needs to be dropped into place in the level editor. The downside is based on the fact that models are processed based on their &#8220;<b>bounding box<\/b>&#8220;, the &#8216;<b>area<\/b>&#8216; the model occupies. If the bounding box itself can be seen, but not necessarily the model it belongs to, then the entire object is rendered irrespective. For large models this presents a performance problem due to the increased number of polygons being rendered as a result of the grouping.<\/p>\n<div class=\"content_images\">\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-optimise-models-group-editor.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Small detailed objects exported as a single model\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-optimise-models-group-editor_sml.jpg\" alt=\"Small detailed objects exported as a single model\" width=\"640\" height=\"400\" border=\"0\" \/><\/a><\/p>\n<p>Small detailed objects can be joined together as a single object and exported as a normal model. However, as they are rendered to screen based on their overall bounding box that potentially means a lot of polygonal data being rendered even though much of it may not be visible to the player <b class=\"blenderFileRef\">[see *.blend &#8220;44a&#8221;]<\/b><\/p>\n<\/div>\n<p>The alternative, and generally preferable route, is to specifically export one of each type of object so the overall model only contains a single instance of the actual mesh that&#8217;s needed. In the level editor this individual model can then duplicated and placed around the map as per the original layout design in Blender &#8211; we can still use the grouped, larger mesh as a temporary guide, we just need to make sure to remove it before the level is finalised. The advantage here is that only the units seen at a given moment are rendered to screen thus saving on over-draw (drawing too much, or more than is necessary to screen).<\/p>\n<div class=\"content_images\">\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-optimise-models-single-editor.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Exporting detailed objects as a single model\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-optimise-models-single-editor_sml.jpg\" alt=\"Exporting detailed objects as a single model\" width=\"640\" height=\"400\" border=\"0\" \/><\/a><\/p>\n<p>Small detailed objects are placed in editor as individual instances of the same core model rather than being exported as a whole. Note that models are processed and drawn based on their &#8220;<b>bounding box<\/b>&#8221; (the white outline), if that can be seen the entire object is drawn <b class=\"blenderFileRef\">[see *.blend &#8220;44b&#8221;]<\/b><\/p>\n<\/div>\n<p><a id=\"coplanar\" name=\"coplanar\"><\/a><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Planar_coplanar_surfaces\"><\/span>Planar &amp; coplanar surfaces<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Ideally we should not be using <b>single sided surfaces<\/b>, either &#8220;<b>planes<\/b>&#8221; or &#8220;<b>faces<\/b>&#8220;, to construct a .map based level. The reason for this is due to the way the export process generates brush volumes by extruding individual polygons along their normals. This creates two problems; 1) because the extrusion of surfaces is limited in depth it results in what&#8217;s commonly referred to as a &#8220;<b>thin skin<\/b>&#8221; mesh. And 2) extruding surfaces in this way generates a disproportionate number of &#8220;unique surfaces&#8221;. Both problems typically mean there are a lot of individual triangles that have to be culled from use or merged together to form larger, more efficient &#8220;<b>coplanar<\/b>&#8221; (&#8220;<b>co-planar<\/b>&#8220;) surfaces. This is one of the primary reasons for building with simple mesh primitives or blocks because it affords greater control over their arrangement and how they can be better made to align more favourably into groups along their major and incidental surfaces.<\/p>\n<p>In practice this means we need to manipulate shapes so surfaces and objects are aligned along the same &#8220;<b>plane<\/b>&#8220;. With the arch for example, leaving the outer edge as it was would have meant an object with four distinct &#8216;planes&#8217; forming the curve<sup>[1-4]<\/sup>, composed are they are of two triangles each. In reshaping the mesh to form a block, the count is reduced to two &#8216;planes&#8217; &#8211; one on &#8216;top&#8217; and one down the &#8216;back&#8217;, each composed of four triangles. This reduction constitutes a much better optimisation of surfaces, producing a more efficient map file that avoids the generation of <b>max_map_<\/b> errors.<\/p>\n<div class=\"content_images\">\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-extras-unique-planes.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Mesh surfaces are seen as individual 'polygons' and 'planes'\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-extras-unique-planes_sml.jpg\" alt=\"Mesh surfaces are seen as individual 'polygons' and 'planes'\" width=\"640\" height=\"400\" border=\"0\" \/><\/a><\/p>\n<p>A collection of individual faces form &#8220;<b>coplanar surfaces<\/b>&#8221; &#8211; elements that orientate along the same &#8216;plane&#8217;. Ideally there should be as few of these as possible. No.&#8217;s [1] through [6] are individual &#8216;planes&#8217; &#8211; [1]-[4] are both &#8216;planes&#8217; and &#8216;surfaces&#8217; because each is orientated to itself. Whereas [5] and [6] are &#8216;coplanar&#8217; surfaces composed of individual elements aligned to form a single &#8216;plane&#8217; <b class=\"blenderFileRef\">[see *.blend &#8220;45&#8221;]<\/b><\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-extras-unified-planes.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Optimising an object to reduce the number of coplanar surfaces\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-extras-unified-planes_sml.jpg\" alt=\"Optimising an object to reduce the number of coplanar surfaces\" width=\"640\" height=\"400\" border=\"0\" \/><\/a><\/p>\n<p>Reshaping the outer edge of the curve reduces the number of unique planes (the top and back edges are no &#8216;coplanar&#8217; surfaces) and helps optimise the level by reducing the &#8216;<b>unique surface count<\/b>&#8216; <b class=\"blenderFileRef\">[see *.blend &#8220;46&#8221;]<\/b><\/p>\n<\/div>\n<p><a id=\"mitring\" name=\"mitring\"><\/a><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Mitring_corners_or_not\"><\/span>Mitring corners, or not<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>As a general rule-of-thumb a &#8220;<b>mitre<\/b>&#8221; doesn&#8217;t in of itself provide any qualitative advantage over other types of joint or corner when used on &#8220;<b>structural<\/b>&#8221; brush volumes. During compile every surface within a level is traced until progress is blocked or ends, usually at a volumes outer edge or an intersection of some kind with another brush. Using a &#8220;<b>butt<\/b>&#8221; or &#8220;<b>mitred<\/b>&#8221; joint typically has the apex of the connection between brushes function as the termination point because the trace can no longer travel along the face being analysed. With &#8220;<b>overlapped<\/b>&#8221; brushes the process continues past the apex until it hits an edge, which may be some distance away depending on the size of the brush, before stopping. This is done to all surfaces to calculate what needs to be rendered to screen and what needs to be removed or &#8220;<b>culled<\/b>&#8221; from the level as &#8216;waste&#8217;.<\/p>\n<div class=\"content_images\">\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-extras-mitred-corners.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Mitred corners are not absolutely necessary\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-extras-mitred-corners_sml.jpg\" alt=\"Mitred corners are not absolutely necessary\" width=\"640\" height=\"400\" border=\"0\" \/><\/a><\/p>\n<p>The two types of &#8216;corner&#8217; typically employed when making a level &#8211; &#8220;<b>Mitred<\/b>&#8221; or &#8220;<b>Butted<\/b>&#8221; corners, although a &#8220;mitre&#8221; may seem a logical technique to use on brushwork it does in fact come with a number of caveats to it use that can have a detrimental affect on compilation <b class=\"blenderFileRef\">[see *.blend &#8220;47&#8221;]<\/b><\/p>\n<\/div>\n<p>There&#8217;s a secondary issue here to do with the way coplanar surfaces are calculated. The logic of this means overlapping and mitred brush volumes are potentially problematic because they have varying degrees of overrun that project beyond each surface being traced. This can result in brush volumes receiving additional cuts and splits as they cross or intersect surface planes belonging to other objects, if we&#8217;re not careful this can cause a lot of extra and miscellaneous brush work to be formed, which then needs to be (re)calculated to determine if <i>they<\/i> should be retraced and\/or culled. This obviously needs to be avoided. By using &#8220;<b>butt<\/b>&#8221; joints where ever possible we facilitate the proper (or &#8220;best fit&#8221;) projection and culling of surfaces being done in an efficient manner, keeping both map data and file size to a minimum as a result.<\/p>\n<blockquote><p><b>Design note<\/b>: other not so incidental reasons for using &#8220;<b>butt<\/b>&#8221; joints is the amount of time it takes to mitre brush volumes on large scale projects. It&#8217;s also not always possible for joints to be complete; any exposed portions are typically non-axial, meaning the angle of the mitre can than cause further issues in such instances, especially if there is a lot of it.<\/p><\/blockquote>\n<div class=\"content_images\">\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-extras-corner-overlap.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Overlapped brushes typically require more calculation time to determine proper structure\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-extras-corner-overlap_sml.jpg\" alt=\"Overlapped brushes typically require more calculation time to determine proper structure\" width=\"640\" height=\"400\" border=\"0\" \/><\/a><\/p>\n<p>Overlapping brush volumes typically require more calculation time to properly determine the structure of a corner. On a large level this can be significant in both the time that&#8217;s taken and the amount of brush data that needs to be culled (corner section and back faces of a brush) <b class=\"blenderFileRef\">[see *.blend &#8220;48&#8221;]<\/b><\/p>\n<\/div>\n<p>Objects and features flagged as &#8220;<b>detail<\/b>&#8221; don&#8217;t undergo the same surface culling procedure as &#8220;<b>structural<\/b>&#8221; volumes\/surfaces so <a title=\"Mitred &quot;detail&quot; volumes\" href=\"https:\/\/www.katsbits.com\/site\/map-curves\/#optimise\" target=\"_self\" rel=\"noopener\">should be mitred and joined properly<\/a> &#8211; there should be no, or very little overlap on these types of structures.<\/p>\n<p><a id=\"addon\" name=\"addon\"><\/a><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Misc_activating_the_MAP_AddOn\"><\/span>Misc. activating the MAP AddOn<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The &#8220;<b>Quake MAP<\/b>&#8221; export script is an &#8220;<b>AddOn<\/b>&#8221; that&#8217;s not active by default. It has to be enabled before it can be used. We can do this on a &#8216;<b>per-project<\/b>&#8216;, or &#8216;<b>default<\/b>&#8216; basis based on how frequently it is required or how convenient it is for the user to have the option available on start-up, or not.<\/p>\n<p>To enable the AddOn, with Blender open click &#8220;<b>File<\/b>&#8221; and then &#8220;<b>User Preferences<\/b>&#8220;, or press &#8220;<b>Ctrl+Alt+U<\/b>&#8221; (&#8220;<b>File \u00bb User Preferences<\/b>&#8220;), the &#8220;<b>Blender User Preferences<\/b>&#8221; window will appear. From here click &#8220;<b>AddOns<\/b>&#8221; (option along the top) then on &#8220;<b>Import\/Export<\/b>&#8220;. A list will appear showing all Blenders available scripts. Scroll down to &#8220;<b>Quake MAP Format<\/b>&#8221; and then click the <b>small checkbox on the right<\/b> of the listing to enable the script. We can then do one of two things, either close the window and have the script enabled for that session, or we can click the &#8220;<b>Save As Default<\/b>&#8221; button bottom-left to have the script load every time Blender is opened. Once done close the window to return back to the main interface.<\/p>\n<div class=\"content_images\">\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-addon-script.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Activating the MAP export AddOn in Blender\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-addon-script_sml.jpg\" alt=\"Activating the MAP export AddOn in Blender\" width=\"640\" height=\"400\" border=\"0\" \/><\/a><\/p>\n<p>The &#8220;<b>Quake MAP<\/b>&#8221; AddOn needs to be enabled before Blender is able to export any .map based levels. From the &#8220;<b>File<\/b>&#8221; menu select &#8220;<b>User Preferences<\/b>&#8221; then in the window that opens select &#8220;<b>Import\/Export<\/b>&#8220;; active &#8220;<b>Quake Map Format<\/b>&#8221; and close the view<\/p>\n<\/div>\n<p><a id=\"entitykit\" name=\"entitykit\"><\/a><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Misc_map_entity_kit\"><\/span>Misc. map entity kit<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>If doing a lot of level deign inside Blender, it&#8217;s worth using a set of generic &#8216;helpers&#8217; that mark entity placements within a map. A <a title=\"Download the .map entity helper kit\" href=\"https:\/\/www.katsbits.com\/site\/radiant-entity-blender\/\">pre-made set of entity helpers can be downloaded from here<\/a>, but if we needed a specific set of objects per the duplication of a particular game set, it would mean creating them. Ideally this should be done in an external file, the contents of which can then be loaded in to a scene using &#8220;<b><a href=\"https:\/\/www.katsbits.com\/site\/map-entities\/#otherentities\">Append<\/a><\/b>&#8221; (&#8220;<b>Shift+F1<\/b>&#8220;) &#8211; this allows individual objects or groups of items to be loaded into the scene as new additions either physically &#8211; a copy is loaded into the scene, or referentially &#8211; a copy is loaded as an &#8216;instance&#8217; that&#8217;s linked to the external file containing the actual objects. Although each has it&#8217;s &#8216;Pros &amp; Cons&#8217;, because they are common elements the idea is not to remake them every time a new project is started.<\/p>\n<blockquote><p><b>Design note<\/b>: if the latter option is chosen remember not to edit the files as changes may propagate into the original linked file which may adversely affect any other level using the same objects in the same way.<\/p><\/blockquote>\n<div class=\"content_images\">\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tools_utilities\/map-entity-kit.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Map entity kit for Blender\" src=\"\/images\/tools_utilities\/map-entity-kit_sml.jpg\" alt=\"Map entity kit for Blender\" width=\"640\" height=\"400\" border=\"0\" \/><\/a><\/p>\n<p>Generic entity helper kit containing the basic entity classes that can be placed into a level as &#8216;placeholders&#8217;; these are not converted into entities on export so need to be removed\/replaced in a level editor (GTK Radiant et-al)<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-extras-object-append.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" title=\"Appending &quot;Object&quot; data to the scene from an external file\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/blender-make-maps-levels\/map-extras-object-append_sml.jpg\" alt=\"Appending &quot;Object&quot; data to the scene from an external file\" width=\"640\" height=\"400\" border=\"0\" \/><\/a><\/p>\n<p>Appending external data to the level using &#8220;<b>File \u00bb Append<\/b>&#8221; and selecting the objects to add &#8211; items can be &#8216;linked&#8217; or &#8216;loaded&#8217; into a scene<\/p>\n<\/div>\n<p><\/p>\n<div class=\"subNav\">[<a title=\"The basics of making maps in Blender\" href=\"https:\/\/www.katsbits.com\/site\/map\/\" target=\"_self\" rel=\"noopener\">1: basics<\/a> | <a title=\"Making a .map based level\" href=\"https:\/\/www.katsbits.com\/site\/map-meshes\/\" target=\"_self\" rel=\"noopener\">2: making<\/a> | <a title=\"Adding curves to a .map based level\" href=\"https:\/\/www.katsbits.com\/site\/map-curves\/\" target=\"_self\" rel=\"noopener\">3: curves<\/a> | <a title=\"Materials, Textures and images\" href=\"https:\/\/www.katsbits.com\/site\/map-materials\/\" target=\"_self\" rel=\"noopener\">4: textures<\/a> | <a title=\"Entities, prepping and export\" href=\"https:\/\/www.katsbits.com\/site\/map-entities\/\" target=\"_self\" rel=\"noopener\">5: entities<\/a> | <a title=\"Opening the map in a level editor\" href=\"https:\/\/www.katsbits.com\/site\/map-level-editor\/\" target=\"_self\" rel=\"noopener\">6: level editor<\/a> | <a title=\".map based level design extras\" href=\"https:\/\/www.katsbits.com\/site\/map-extras\/\" target=\"_self\" rel=\"noopener\">7: extras<\/a>]<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":1609,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[327,215,276,277,278,331,32,106,418,109,108,204,421,25,420,107,419],"class_list":["post-1610","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-map","tag-add-on","tag-blender-2-5x","tag-blender-2-6x","tag-blender-2-7x","tag-bsp","tag-assets","tag-gtkradiant","tag-hammer-editor","tag-level-design","tag-level-editing","tag-level-editor","tag-map-basics","tag-materials","tag-preferences","tag-radiant","tag-shader"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/posts\/1610","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/comments?post=1610"}],"version-history":[{"count":8,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/posts\/1610\/revisions"}],"predecessor-version":[{"id":1659,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/posts\/1610\/revisions\/1659"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/media\/1609"}],"wp:attachment":[{"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/media?parent=1610"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/categories?post=1610"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.katsbits.com\/site\/wp-json\/wp\/v2\/tags?post=1610"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}